Index: samigo-api/src/java/xml/author/v1p2/mcSCTemplate.xml =================================================================== --- samigo-api/src/java/xml/author/v1p2/mcSCTemplate.xml (revision 180) +++ samigo-api/src/java/xml/author/v1p2/mcSCTemplate.xml (revision 201) @@ -36,6 +36,10 @@ false + PARTIAL_CREDIT + false + + RANDOMIZE false Index: samigo-api/src/java/xml/xsl/dataTransform/import/v1p2/extractItem.xsl =================================================================== --- samigo-api/src/java/xml/xsl/dataTransform/import/v1p2/extractItem.xsl (revision 180) +++ samigo-api/src/java/xml/xsl/dataTransform/import/v1p2/extractItem.xsl (revision 201) @@ -255,6 +255,12 @@ + + + + + + Index: samigo-api/src/java/org/sakaiproject/tool/assessment/data/ifc/assessment/ItemDataIfc.java =================================================================== --- samigo-api/src/java/org/sakaiproject/tool/assessment/data/ifc/assessment/ItemDataIfc.java (revision 180) +++ samigo-api/src/java/org/sakaiproject/tool/assessment/data/ifc/assessment/ItemDataIfc.java (revision 201) @@ -90,7 +90,12 @@ Boolean getHasRationale(); void setHasRationale(Boolean hasRationale); - + + void setPartialCreditFlag(Boolean particalCreditFlag); + Boolean getPartialCreditFlag(); + +// void setPartialCredit(Float partialCredit); + // Float getPartialCredit(); Integer getStatus(); void setStatus(Integer status); @@ -170,4 +175,7 @@ void setItemAttachmentSet(Set itemAttachmentSet); List getItemAttachmentList(); + + + } Index: samigo-api/src/java/org/sakaiproject/tool/assessment/data/ifc/assessment/AnswerIfc.java =================================================================== --- samigo-api/src/java/org/sakaiproject/tool/assessment/data/ifc/assessment/AnswerIfc.java (revision 180) +++ samigo-api/src/java/org/sakaiproject/tool/assessment/data/ifc/assessment/AnswerIfc.java (revision 201) @@ -69,7 +69,12 @@ Float getScore(); void setScore(Float score); - + // to incorporate partial credit we need to add field for partial credit + void setPartialCredit(Float partialCredit); + Float getPartialCredit(); + //void setPartialCreditFlag(boolean partialCreditFlag); + // boolean getPartialCreditFlag(); + Set getAnswerFeedbackSet(); ArrayList getAnswerFeedbackArray(); Index: samlite-impl/.project =================================================================== --- samlite-impl/.project (revision 180) +++ samlite-impl/.project (revision 201) @@ -3,6 +3,8 @@ sakai-samigo-api + sakai-samigo-hibernate + sakai-samigo-services Index: samigo-app/src/java/org/sakaiproject/tool/assessment/bundle/AuthorMessages.properties =================================================================== --- samigo-app/src/java/org/sakaiproject/tool/assessment/bundle/AuthorMessages.properties (revision 180) +++ samigo-app/src/java/org/sakaiproject/tool/assessment/bundle/AuthorMessages.properties (revision 201) @@ -157,6 +157,7 @@ multiple_choice_type=Multiple Choice multipl_mc_ss=Multiple Correct, Single Selection multipl_mc_ms=Multiple Correct, Multiple Selection +multiple_mc_ss_pc=Multiple Correct, Single Selection with Partial Credit multiple_correct_ms=Multiple Correct, Multiple Selection multiple_correct_ss=Multiple Correct, Singe Selection multiple_choice_sin=Single Correct @@ -494,3 +495,11 @@ action_export=Export action_remove=Remove action_scores=Scores + +enable_partial_credit=Enable Partial Credit +reset_grading_logic=Reset to Default Grading Logic +enable_nagative_marking=Enable Negative Marking +percentange_vaue=% Value +reset_score_values=Reset Score Values +enter_new_pc_value=Enter new value (optional) + Index: samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/ItemSpecialFeatureBean.java =================================================================== --- samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/ItemSpecialFeatureBean.java (revision 0) +++ samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/ItemSpecialFeatureBean.java (revision 201) @@ -0,0 +1,51 @@ +/********************************************************************************** + * $URL: https://source.sakaiproject.org/svn/sam/trunk/samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/AnswerBean.java $ + * $Id: ItemSpecialFeatureBean.java mustansar@rice.edu $ + *********************************************************************************** + * + * Copyright (c) 2004, 2005, 2006, 2007, 2008 The Sakai Foundation + * + * Licensed under the Educational Community License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.osedu.org/licenses/ECL-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + * + **********************************************************************************/ +package org.sakaiproject.tool.assessment.ui.bean.author; +import org.sakaiproject.component.cover.ServerConfigurationService; +public class ItemSpecialFeatureBean { + boolean partialCreditEnabled=false; + +public ItemSpecialFeatureBean(){ + + } + public boolean isPartialCreditEnabled(){ + String autoSubmitEnabled = ServerConfigurationService.getString("samigo.partialCreditEnabled"); + if(autoSubmitEnabled.equalsIgnoreCase("true")){ + return true; + }else{ + return false; + } + + } + +public void setPartialCreditEnabled(boolean partialCreditEnabled ){ + this.partialCreditEnabled=partialCreditEnabled; + } +/*public boolean setPartialCreditEnabled(){ + String autoSubmitEnabled = ServerConfigurationService.getString("samigo.partialCreditEnabled"); + if(autoSubmitEnabled.equalsIgnoreCase("true")){ + return true; + }else{ + return false; + } + +}*/ +} Index: samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/ItemBean.java =================================================================== --- samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/ItemBean.java (revision 180) +++ samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/ItemBean.java (revision 201) @@ -58,13 +58,15 @@ private String itemType; private String itemScore= "0"; private String itemDiscount= "0"; + private String partialCreditFlag="Defualt"; + private boolean partialCreditEnabled=false; private String[] answers; private String[] answerLabels; // such as A, B, C private String[] corrAnswers; // store checkbox values(labels) for multiple correct answers, as in mcmc type private String corrAnswer; // store text value for single correct answer, as in true/false , mcsc, also used for essay's model answer private ArrayList multipleChoiceAnswers; // store List of answers multiple choice items, ArrayList of AnswerBean private String additionalChoices = "0"; // additonal multiple choice answers to be add. for the select menu - + private int totalMCAsnwers; @@ -130,8 +132,36 @@ /** * @return */ + /**@author Mustansar Mehmood + * + */ +public void setPartialCreditFlag(String partialCreditFlag){ + this.partialCreditFlag=partialCreditFlag; +} +/**@author Mustansar Mehmood + * + * @return + */ +public String getPartialCreditFlag(){ + if(this.isPartialCreditEnabled()){ + return partialCreditFlag; + } + else{ + return "false"; + } +} + + public boolean isPartialCreditEnabled() { + ItemSpecialFeatureBean specialFeatureBean= new ItemSpecialFeatureBean(); + + return specialFeatureBean.isPartialCreditEnabled(); +} + +/*public void setPartialCreditEnabled(boolean partialCreditEnabled) { + this.partialCreditEnabled = partialCreditEnabled; +}*/ - public String getOutcome() +public String getOutcome() { return outcome; } @@ -955,6 +985,54 @@ } } + public void togglePartialCredit(ValueChangeEvent event){ + + String switchEvent = (String) event.getNewValue(); + + if( Boolean.parseBoolean(switchEvent)){ + setPartialCreditFlag("true"); + } + + else if(new String("False").equalsIgnoreCase(switchEvent)) { + setPartialCreditFlag("false"); + } + else{ + setPartialCreditFlag("Default"); + } + } + + public void resetPartialCreditValues(){ + + ArrayList answersList=this.getMultipleChoiceAnswers(); + Iterator iter = answersList.iterator(); + // information about about the correct answer is not available here so checking whether the answer is correct + //simply leads to NPE. + while(iter.hasNext()){ + AnswerBean answerBean=(AnswerBean)iter.next(); + if(answerBean.getPartialCredit().floatValue()<100.00){ + answerBean.setPartialCredit(new Float(0.0));} + else if(answerBean.getPartialCredit().floatValue()==100.00); + answerBean.setIsCorrect(true); + + + } + this.setMultipleChoiceAnswers(answersList); + } + + public String resetToDefaultGradingLogic(){ + // String switchEvent = (String) event.getNewValue(); + partialCreditFlag="Default"; + ArrayList answersList=this.getMultipleChoiceAnswers(); + Iterator iter = answersList.iterator(); + // information about about the correct answer is not available here so checking whether the answer is correct + //simply leads to NPE. + while(iter.hasNext()){ + AnswerBean answerBean=(AnswerBean)iter.next(); + answerBean.setPartialCredit(new Float(0.0)); + } + this.setMultipleChoiceAnswers(answersList); + return null; + } /* // this doesn't seem to be used public void addChoices(ValueChangeEvent event) { @@ -1004,7 +1082,9 @@ setAdditionalChoices("0"); // if mcmc, need to set corrAnswers - if (TypeFacade.MULTIPLE_CORRECT.toString().equals(this.itemType) || TypeFacade.MULTIPLE_CORRECT_SINGLE_SELECTION.toString().equals(this.itemType)) { + if (TypeFacade.MULTIPLE_CORRECT.toString().equals(this.itemType) || TypeFacade.MULTIPLE_CORRECT_SINGLE_SELECTION.toString().equals(this.itemType) + // ||TypeFacade.MULTIPLE_CHOICE_SINGLE_SELECTION_WITH_PARTIAL_CREDIT.toString().equals(this.itemType) + ) { ArrayList corranswersList = ContextUtil.paramArrayValueLike("mccheckboxes"); int corrsize = corranswersList.size(); int counter = 0; @@ -1372,7 +1452,12 @@ this.showMutuallyExclusiveForFinCheckbox= param; } - - + public int gettotalMCAnswers(){ + return this.multipleChoiceAnswers.size(); + } + public void settotalMCAnswers(){ + this.totalMCAsnwers= this.multipleChoiceAnswers.size(); + } } + Index: samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/AnswerBean.java =================================================================== --- samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/AnswerBean.java (revision 180) +++ samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/AnswerBean.java (revision 201) @@ -35,6 +35,7 @@ private String label; private String feedback; private Boolean isCorrect; + private Float partialCredit=new Float(0.0); //to incorporate partial credit private static ResourceLoader rb = new ResourceLoader("org.sakaiproject.tool.assessment.bundle.AuthorMessages"); public static final String choiceLabels = rb.getString("choice_labels"); @@ -48,7 +49,22 @@ this.isCorrect = pcorr; } - + //additional constroctor for partial credit + public AnswerBean(String ptext, Long pseq, String plabel, String pfdbk, Boolean pcorr, String pgrade , Float pscore , Float pCredit) { + this.text = ptext; + this.sequence = pseq; + this.label = plabel; + this.feedback= pfdbk; + this.isCorrect = pcorr; + this.partialCredit=pCredit; + } + //--mustansar for partial credit + public Float getPartialCredit(){ + return partialCredit; + } + public void setPartialCredit(Float pCredit ){ + this.partialCredit=pCredit; + } public String getText() { return text; } Index: samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/IndexBean.java =================================================================== --- samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/IndexBean.java (revision 180) +++ samigo-app/src/java/org/sakaiproject/tool/assessment/ui/bean/author/IndexBean.java (revision 201) @@ -61,6 +61,7 @@ private String templateOrderBy= "templateName"; private boolean templateAscending= true; private boolean automaticSubmissionEnabled = false; + private boolean partialCreditEnabled=false; private static Log log = LogFactory.getLog(IndexBean.class); @@ -119,7 +120,15 @@ this.templateList = templateList; } - public ArrayList getSortTemplateList() + public boolean isPartialCreditEnabled() { + return partialCreditEnabled; +} + +public void setPartialCreditEnabled(boolean partialCreditEnabled) { + this.partialCreditEnabled = partialCreditEnabled; +} + +public ArrayList getSortTemplateList() { return this.sortTemplateList; } Index: samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/StartCreateItemListener.java =================================================================== --- samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/StartCreateItemListener.java (revision 180) +++ samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/StartCreateItemListener.java (revision 201) @@ -233,6 +233,8 @@ } // check for metadata settings + //setting a default qauestion setting for partial credit + // item.setPartialCreditFlag("0"); if ("assessment".equals(itemauthorbean.getTarget())) { AssessmentService assessdelegate = new AssessmentService(); AssessmentFacade assessment = assessdelegate.getAssessment(assessmentBean.getAssessmentId()); Index: samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ItemModifyListener.java =================================================================== --- samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ItemModifyListener.java (revision 180) +++ samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ItemModifyListener.java (revision 201) @@ -156,8 +156,23 @@ { discount ="0.0"; } + bean.setItemDiscount(discount); - + //partical credit flag + String partialCreditFlag; + Boolean hasPartialCredit=itemfacade.getPartialCreditFlag(); + if(hasPartialCredit!=null) + { + partialCreditFlag=hasPartialCredit.toString(); + } + else + { + partialCreditFlag="FALSE"; + } + bean.setPartialCreditFlag(partialCreditFlag); + + + if (itemfacade.getHasRationale() !=null) { bean.setRationale(itemfacade.getHasRationale().toString()); } @@ -426,6 +441,9 @@ answerbean.getIsCorrect().booleanValue()) { correctlist.add(answerbean); } + // making sure if there is any partial credit in place we account for that --mustansar + if (new Long(itemauthorbean.getItemType()).equals(TypeFacade.MULTIPLE_CHOICE)) + answerbean.setPartialCredit(answerArray[i].getPartialCredit()); answerbeanlist.add(answerbean); } Index: samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ItemAddListener.java =================================================================== --- samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ItemAddListener.java (revision 180) +++ samigo-app/src/java/org/sakaiproject/tool/assessment/ui/listener/author/ItemAddListener.java (revision 201) @@ -122,14 +122,21 @@ } - if(iType.equals(TypeFacade.MULTIPLE_CHOICE.toString())) + if(iType.equals(TypeFacade.MULTIPLE_CHOICE.toString())){ checkMC(true); + //if(item.getParticalCreditFlag()) + //item.setPartialCreditFlag(Boolean.TRUE.toString());// may need to delete when this turns out to be redundant --mustansar TODO + } + // if(iType.equals(TypeFacade.MULTIPLE_CHOICE_SINGLE_SELECTION_WITH_PARTIAL_CREDIT.toString())) + // item.setPartialCreditFlag(Boolean.TRUE.toString());// may need to delete when this turns out to be redundant --mustansar + if(iType.equals(TypeFacade.MULTIPLE_CORRECT.toString())) checkMC(false); if(iType.equals(TypeFacade.MULTIPLE_CORRECT_SINGLE_SELECTION.toString())) checkMC(false); + if(iType.equals(TypeFacade.MATCHING.toString())) { @@ -519,10 +526,13 @@ if (bean.getRationale() != null) { item.setHasRationale(Boolean.valueOf(bean.getRationale())); } + else { item.setHasRationale(Boolean.FALSE); } - + // if(bean.getPartialCreditFlag()!=null){ + item.setPartialCreditFlag(Boolean.valueOf(bean.getPartialCreditFlag())); +// } // update maxNumAttempts for audio if (bean.getNumAttempts() != null) { item.setTriesAllowed(Integer.valueOf(bean.getNumAttempts())); @@ -699,6 +709,8 @@ // reset InsertPosition itemauthor.setInsertPosition(""); } + + } if (itemauthor.getInsertToSection() != null) { // reset insertToSection to null; @@ -789,7 +801,7 @@ .getMatch()), answerbean.getSequence(), AnswerBean .getChoiceLabels()[answerbean.getSequence() .intValue() - 1], Boolean.TRUE, null, Float.valueOf( - bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + bean.getItemScore()),null, Float.valueOf(bean.getItemDiscount())); // only add feedback for correct pairs HashSet answerFeedbackSet = new HashSet(); @@ -806,7 +818,7 @@ .getMatch()), answerbean.getSequence(), AnswerBean .getChoiceLabels()[answerbean.getSequence() .intValue() - 1], Boolean.FALSE, null, Float.valueOf( - bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + bean.getItemScore()), new Float(0.0), Float.valueOf(bean.getItemDiscount())); } // record answers for all combination of pairs @@ -867,11 +879,15 @@ newanswer = new Answer(text1, theanswer, Long.valueOf(i + 1), "", Boolean.TRUE, null, Float.valueOf(bean - .getItemScore()), Float.valueOf(bean.getItemDiscount())); + .getItemScore()), + new Float(0.0),//partial credit + Float.valueOf(bean.getItemDiscount())); } else { newanswer = new Answer(text1, theanswer, Long.valueOf(i + 1), "", Boolean.FALSE, null, Float.valueOf(bean - .getItemScore()), Float.valueOf(bean.getItemDiscount())); + .getItemScore()), + new Float(0.0), //partial credit + Float.valueOf(bean.getItemDiscount())); } answerSet1.add(newanswer); } @@ -891,7 +907,9 @@ // label is null because we don't use labels in essay questions // theanswer is the model answer used as a sample for student Answer modelanswer = new Answer(text1, theanswer, Long.valueOf(1), - null, Boolean.TRUE, null, Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + null, Boolean.TRUE, null, Float.valueOf(bean.getItemScore()), + new Float(0.0), //no partial credit for essay questions + Float.valueOf(bean.getItemDiscount())); HashSet answerFeedbackSet1 = new HashSet(); @@ -911,7 +929,9 @@ for (int i = 0; i < choices.length; i++) { Answer answer1 = new Answer(text1, choices[i], Long.valueOf(i + 1), - null, null, null, Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + null, null, null, Float.valueOf(bean.getItemScore()), + new Float(0.0), // no partial credit in multiple choice survey + Float.valueOf(bean.getItemDiscount())); answerSet1.add(answer1); } text1.setAnswerSet(answerSet1); @@ -931,7 +951,9 @@ String oneanswer = (String) fibanswers[i]; Answer answer1 = new Answer(text1, oneanswer, Long.valueOf(i + 1), null, Boolean.TRUE, null, - Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + Float.valueOf(bean.getItemScore()), + new Float(0.0), // no partial credit in fib + Float.valueOf(bean.getItemDiscount())); answerSet1.add(answer1); } @@ -951,7 +973,9 @@ String oneanswer = (String) finanswers[i]; Answer answer1 = new Answer(text1, oneanswer, Long.valueOf(i + 1), null, Boolean.TRUE, null, - Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + Float.valueOf(bean.getItemScore()), + new Float(0.0), // no partial credit in fib + Float.valueOf(bean.getItemDiscount())); answerSet1.add(answer1); } @@ -962,7 +986,10 @@ else if ((item.getTypeId().equals(TypeFacade.MULTIPLE_CHOICE)) || (item.getTypeId().equals(TypeFacade.MULTIPLE_CORRECT)) - || (item.getTypeId().equals(TypeFacade.MULTIPLE_CORRECT_SINGLE_SELECTION))) { + || (item.getTypeId().equals(TypeFacade.MULTIPLE_CORRECT_SINGLE_SELECTION)) ) { + ////|| item.getTypeId().equals(TypeFacade.MULTIPLE_CHOICE_SINGLE_SELECTION_WITH_PARTIAL_CREDIT) + + //We may have to later add another else if block to separate partial credit from rest of the computations --mustansar // this is for both single/multiple correct multiple choice types // for single choice @@ -975,12 +1002,44 @@ answer = new Answer(text1, stripPtags(answerbean.getText()), answerbean .getSequence(), answerbean.getLabel(), - Boolean.TRUE, null, Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + Boolean.TRUE, null, Float.valueOf(bean.getItemScore()), + new Float(100.00), // //putting data in the table through Answer.java if the answer IS correct + Float.valueOf(bean.getItemDiscount())); } else { - answer = new Answer(text1, + /* answer = new Answer(text1, stripPtags(answerbean.getText()), answerbean .getSequence(), answerbean.getLabel(), - Boolean.FALSE, null, Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + Boolean.FALSE, null, Float.valueOf(bean.getItemScore()), + new Float(0.0), // no partial credit in fib + Float.valueOf(bean.getItemDiscount()));*/ + //putting data in the table through Answer.java if the answer is NOT correct + + // Float flpc= new Float(bean.getItemScore()); + + if(item.getTypeId().equals(TypeFacade.MULTIPLE_CHOICE)&&item.getPartialCreditFlag()){ + Float pc = answerbean.getPartialCredit(); //--mustansar + if(pc==null) + pc=new Float(0.0); + answer = new Answer + (text1, + stripPtags(answerbean.getText()), + answerbean.getSequence(), + answerbean.getLabel(), + Boolean.FALSE, null, new Float(bean.getItemScore()) , + pc, + Float.valueOf(bean.getItemDiscount()));} + else{ + answer = new Answer + (text1, + stripPtags(answerbean.getText()), + answerbean.getSequence(), + answerbean.getLabel(), + Boolean.FALSE, null, new Float(bean.getItemScore()) , + new Float(0.0), //No partial Credit since it is not enabled the column is not null + Float.valueOf(bean.getItemDiscount())); + } + + } HashSet answerFeedbackSet1 = new HashSet(); answerFeedbackSet1.add(new AnswerFeedback(answer, @@ -1114,7 +1173,9 @@ for (int i = 0; i < choices.length; i++) { AnswerIfc answer = new PublishedAnswer(text, choices[i], Long.valueOf(i + 1), - null, null, null, Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + null, null, null, Float.valueOf(bean.getItemScore()), + null,//partial Cred + Float.valueOf(bean.getItemDiscount())); answerSet.add(answer); } text.setAnswerSet(answerSet); @@ -1161,7 +1222,9 @@ String oneanswer = (String) answers[j]; AnswerIfc answer = new PublishedAnswer(text, oneanswer, Long.valueOf(j + 1), null, Boolean.TRUE, null, - Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + Float.valueOf(bean.getItemScore()), + null, //partial credit + Float.valueOf(bean.getItemDiscount())); answerSet.add(answer); } } @@ -1231,12 +1294,15 @@ if (isCorrectChoice(bean, answerBean.getLabel().trim())) { answer = new PublishedAnswer(text, oneAnswer, Long.valueOf(j), oneLabel, Boolean.TRUE, null, - Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + Float.valueOf(bean.getItemScore()), + null, Float.valueOf(bean.getItemDiscount())); } else { answer = new PublishedAnswer(text, oneAnswer, Long.valueOf(j), oneLabel, Boolean.FALSE, null, - Float.valueOf(bean.getItemScore()), Float.valueOf(bean.getItemDiscount())); + Float.valueOf(bean.getItemScore()), + null,//partial Credit + Float.valueOf(bean.getItemDiscount())); } HashSet answerFeedbackSet = new HashSet(); answerFeedbackSet.add(new PublishedAnswerFeedback(answer, @@ -1314,7 +1380,9 @@ .getChoiceLabels()[matchBean .getSequence().intValue() - 1], Boolean.TRUE, null, new Float(bean - .getItemScore()), Float.valueOf(bean.getItemDiscount())); + .getItemScore()), + null,//partial credit + Float.valueOf(bean.getItemDiscount())); } else { answer = new PublishedAnswer(itemText, stripPtags(matchBean.getMatch()), matchBean @@ -1322,7 +1390,9 @@ .getChoiceLabels()[matchBean .getSequence().intValue() - 1], Boolean.FALSE, null, new Float(bean - .getItemScore()), Float.valueOf(bean.getItemDiscount())); + .getItemScore()), + null,//partial credit + Float.valueOf(bean.getItemDiscount())); } // record answers for all combination of pairs Index: samigo-app/src/webapp/jsf/author/editAssessment.jsp =================================================================== --- samigo-app/src/webapp/jsf/author/editAssessment.jsp (revision 180) +++ samigo-app/src/webapp/jsf/author/editAssessment.jsp (revision 201) @@ -61,6 +61,16 @@ document.links[newindex].onclick(); } +function relocatePartialCreditToggle(){ + alert("ok, I guess"); + var toggleDiv=document.getElementById('partialCredit_toggle'); + if( typeof(toggleDiv) == 'undefined' || toggleDiv == null) {return;} + else{ + var QtypeTable=document.getElementById('itemForm:chooseAnswerTypeForMC'); + QtypeTable.rows[0].cells[0].appendChild(toggleDiv); + } +} + //--> Index: samigo-app/src/webapp/jsf/author/item/multipleChoice.jsp =================================================================== --- samigo-app/src/webapp/jsf/author/item/multipleChoice.jsp (revision 180) +++ samigo-app/src/webapp/jsf/author/item/multipleChoice.jsp (revision 201) @@ -36,7 +36,7 @@ -"> +">
@@ -86,27 +86,71 @@

- - -
- + +
+
+ +
+ + + + + +
+ +
+ + + + + + + + + +
+ +
+ - + - - - - - - + + -
- +
@@ -123,34 +167,14 @@ <%@ include file="/jsf/author/item/attachment.jsp" %> - -
-
- -
- - - - - -
- +
- - - +
@@ -159,32 +183,39 @@ - + - - + + - +
- + + - + @@ -193,7 +224,35 @@
- + +
+ + + +- + + + + +



+ + + + + +
@@ -312,8 +371,6 @@ - - Index: samigo-app/src/webapp/jsf/author/item/itemHeadings.jsp =================================================================== --- samigo-app/src/webapp/jsf/author/item/itemHeadings.jsp (revision 180) +++ samigo-app/src/webapp/jsf/author/item/itemHeadings.jsp (revision 201) @@ -124,7 +124,7 @@ <%-- not from qpool , show the last option: copy from question pool --%> - @@ -145,7 +145,7 @@ - + Index: samigo-app/src/webapp/jsf/author/preview_item/MultipleChoiceSingleCorrect.jsp =================================================================== --- samigo-app/src/webapp/jsf/author/preview_item/MultipleChoiceSingleCorrect.jsp (revision 180) +++ samigo-app/src/webapp/jsf/author/preview_item/MultipleChoiceSingleCorrect.jsp (revision 201) @@ -25,6 +25,11 @@ --> + + + + + <%@ include file="/jsf/author/preview_item/attachment.jsp" %> Index: samigo-app/src/webapp/js/authoring.js =================================================================== --- samigo-app/src/webapp/js/authoring.js (revision 180) +++ samigo-app/src/webapp/js/authoring.js (revision 201) @@ -101,26 +101,101 @@ // this is for multiple choice authoring. uncheck all other radio buttons when one is checked, to make it behave like they are in an array. +/*function uncheckOthers(field){ + var fieldname = field.getAttribute("name"); + var tables= document.getElementsByTagName("TABLE"); + + for (var i = 0; i < tables.length; i++) { + if ( tables[i].id.indexOf("mcradiobtn") >=0){ + var radiobtn = tables[i].getElementsByTagName("INPUT")[0]; + // go through the radio buttons, if it's the one clicked on, uncheck all others + if (fieldname!=radiobtn.getAttribute("name")){ + radiobtn.checked = false; + } + } + } + + var selectId = field.getAttribute("value"); + var inputhidden = document.getElementById("itemForm:selectedRadioBtn"); + inputhidden.setAttribute("value", selectId); + + }*/ +function resetPartialCreditValue(){ + var pTables= document.getElementsByTagName("TABLE"); + for (var i = 0; i < pTables.length; i++) { + if ( pTables[i].id.indexOf("partialCreditInput") >=0){ + var pcInput = pTables[i].getElementsByTagName("INPUT")[0]; + var pcInputVal=pcInput.valueOf().value; + var fltpcValue= parseFloat(pcInputVal); + if(fltpcValue<100||isNaN(fltpcValue)){ + pcInput.valueOf().value="0.0"; + } + } +} +} function uncheckOthers(field){ - var fieldname = field.getAttribute("name"); - var tables= document.getElementsByTagName("TABLE"); + var fieldname = field.getAttribute("name"); + var tables= document.getElementsByTagName("TABLE"); + var prevCorrectBtn=null; - for (var i = 0; i < tables.length; i++) { - if ( tables[i].id.indexOf("mcradiobtn") >=0){ - var radiobtn = tables[i].getElementsByTagName("INPUT")[0]; -// go through the radio buttons, if it's the one clicked on, uncheck all others - if (fieldname!=radiobtn.getAttribute("name")){ - radiobtn.checked = false; + for (var i = 0; i < tables.length; i++) { + if ( tables[i].id.indexOf("mcradiobtn") >=0){ + var radiobtn = tables[i].getElementsByTagName("INPUT")[0]; + if (fieldname!=radiobtn.getAttribute("name")){ + if(radiobtn.checked){ + prevCorrectBtn=radiobtn.getAttribute("name"); + radiobtn.checked = false; + } + else{ + radiobtn.checked = false; + } + } + } } - } + var selectId = field.getAttribute("value"); + var inputhidden = document.getElementById("itemForm:selectedRadioBtn"); + inputhidden.setAttribute("value", selectId); + swtichPartialCredit(fieldname,prevCorrectBtn ); + + } + function swtichPartialCredit(newCorrect,oldCorrect){ + var toggleDiv=document.getElementById('partialCredit_toggle'); + if( typeof(toggleDiv) == 'undefined' ||toggleDiv == null){ + return; } - -var selectId = field.getAttribute("value"); -var inputhidden = document.getElementById("itemForm:selectedRadioBtn"); -inputhidden.setAttribute("value", selectId); - -} + else{ + //setting old one to zero + if(oldCorrect!=null && oldCorrect!='undefined'){ + var position= oldCorrect.split(":"); + var prevcorrId="itemForm:mcchoices:"+position[2]+":partialCredit"; + var pInput= document.getElementById(prevcorrId); + pInput.valueOf().value=0; + pInput.style.borderStyle = "solid double"; + pInput.style.borderColor="red"; + pInput.focus(); + var reminderTextId="itemForm:mcchoices:"+position[2]+":partialCreditReminder"; + var reminderTexElement= document.getElementById(reminderTextId); + reminderTexElement.style.visibility="visible" + } + else{;} + //setting new one to 100 + + position= newCorrect.split(":"); + var currCorrId="itemForm:mcchoices:"+position[2]+":partialCredit"; + var correctPInput= document.getElementById(currCorrId); + correctPInput.valueOf().value=100; + } + } + function verifyPCValue(partialCreditInput){ + var pcValue=partialCreditInput.valueOf().value; + var fltValue= parseFloat(pcValue); + if(fltValue >100||isNaN(fltValue)) + { + partialCreditInput.valueOf().value="0.0" + } + +} function resetInsertAnswerSelectMenus(){ var selectlist = document.getElementsByTagName("SELECT"); @@ -129,6 +204,13 @@ selectlist[i].value = 0; } } + + var toggleDiv=document.getElementById('partialCredit_toggle'); + if( typeof(toggleDiv) == 'undefined' || toggleDiv == null){ return;} + else{ + var QtypeTable=document.getElementById('itemForm:chooseAnswerTypeForMC'); + QtypeTable.rows[0].cells[0].appendChild(toggleDiv); + } } @@ -189,3 +271,14 @@ } } } +//Author Mustansar Mehmood +//mustansar@rice.edu +function relocatePartialCreditToggle(){ + var toggleDiv=document.getElementById('partialCredit_toggle'); + if( typeof(toggleDiv) == 'undefined' || toggleDiv == null){ return;} + else{ + var QtypeTable=document.getElementById('itemForm:chooseAnswerTypeForMC'); + QtypeTable.rows[0].cells[0].appendChild(toggleDiv); + } +} + Index: samigo-archive/sam-handlers/pom.xml =================================================================== --- samigo-archive/sam-handlers/pom.xml (revision 180) +++ samigo-archive/sam-handlers/pom.xml (revision 201) @@ -25,12 +25,12 @@ sakai-kernel-api - org.sakaiproject - sakai-import-api + org.sakaiproject.common + archive-api - org.sakaiproject - sakai-import-impl + org.sakaiproject.common + import-impl @@ -68,3 +68,4 @@ + Index: samigo-services/src/java/org/sakaiproject/tool/assessment/facade/TypeFacade.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/facade/TypeFacade.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/facade/TypeFacade.java (revision 201) @@ -49,6 +49,7 @@ public static final Long FILL_IN_NUMERIC = Long.valueOf(11); public static final Long MATCHING = Long.valueOf(9); public static final Long MULTIPLE_CORRECT_SINGLE_SELECTION = Long.valueOf(12); + //public static final Long MULTIPLE_CHOICE_SINGLE_SELECTION_WITH_PARTIAL_CREDIT=Long.valueOf(13); // these are section type available in this site, public static final Long DEFAULT_SECTION = Long.valueOf(21); // these are assessment template type available in this site, Index: samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ItemFacadeQueries.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ItemFacadeQueries.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ItemFacadeQueries.java (revision 201) @@ -369,14 +369,20 @@ HashSet answerSet1 = new HashSet(); HashSet answerFeedbackSet1 = new HashSet(); Answer answer1 = new Answer(text1, "2 legs", Long.valueOf(1), "i", - Boolean.FALSE, null, Float.valueOf(0), Float.valueOf(0)); + Boolean.FALSE, null, Float.valueOf(0), + new Float(0.0),//partical credit, + Float.valueOf(0)); answerFeedbackSet1.add(new AnswerFeedback(answer1, "incorrect", "sorry")); answer1.setAnswerFeedbackSet(answerFeedbackSet1); answerSet1.add(answer1); answerSet1.add(new Answer(text1, "3 legs", Long.valueOf(2), "ii", - Boolean.FALSE, null, Float.valueOf(0), Float.valueOf(0))); + Boolean.FALSE, null, Float.valueOf(0), + new Float(0.0),//partical credit + Float.valueOf(0))); answerSet1.add(new Answer(text1, "4 legs", Long.valueOf(3), "iii", - Boolean.TRUE, null, Float.valueOf(5), Float.valueOf(0))); + Boolean.TRUE, null, Float.valueOf(5), + new Float(0.0),//partical credit + Float.valueOf(0))); text1.setAnswerSet(answerSet1); textSet.add(text1); @@ -387,11 +393,17 @@ text2.setText("chicken has"); HashSet answerSet2 = new HashSet(); answerSet2.add(new Answer(text2, "2 legs", Long.valueOf(1), "i", - Boolean.TRUE, null, Float.valueOf(5), Float.valueOf(0))); + Boolean.TRUE, null, Float.valueOf(5), + new Float(0.0),//partical credit + Float.valueOf(0))); answerSet2.add(new Answer(text2, "3 legs", Long.valueOf(2), "ii", - Boolean.FALSE, null, Float.valueOf(0), Float.valueOf(0))); + Boolean.FALSE, null, Float.valueOf(0), + new Float(0.0),//partical credit + Float.valueOf(0))); answerSet2.add(new Answer(text2, "4 legs", Long.valueOf(3), "iii", - Boolean.FALSE, null, Float.valueOf(0), Float.valueOf(0))); + Boolean.FALSE, null, Float.valueOf(0), + new Float(0.0),//partical credit + Float.valueOf(0))); text2.setAnswerSet(answerSet2); textSet.add(text2); @@ -401,11 +413,17 @@ text3.setText("baby has"); HashSet answerSet3 = new HashSet(); answerSet3.add(new Answer(text3, "2 legs", Long.valueOf(1), "i", - Boolean.FALSE, null, Float.valueOf(0), Float.valueOf(0))); + Boolean.FALSE, null, Float.valueOf(0), + new Float(0.0),//partical credit + Float.valueOf(0))); answerSet3.add(new Answer(text3, "3 legs", Long.valueOf(2), "ii", - Boolean.FALSE, null, Float.valueOf(0), Float.valueOf(0))); + Boolean.FALSE, null, Float.valueOf(0), + new Float(0.0),//partical credit + Float.valueOf(0))); answerSet3.add(new Answer(text3, "4 legs", Long.valueOf(3), "iii", - Boolean.TRUE, null, Float.valueOf(5), Float.valueOf(0))); + Boolean.TRUE, null, Float.valueOf(5), + new Float(0.0),//partical credit + Float.valueOf(0))); text3.setAnswerSet(answerSet3); textSet.add(text3); return textSet; @@ -441,6 +459,7 @@ item.setCreatedDate(new Date()); item.setLastModifiedBy("1"); item.setLastModifiedDate(new Date()); + // prepare itemText item.setItemTextSet(prepareText((ItemData)item.getData())); @@ -471,6 +490,16 @@ public ItemFacade saveItem(ItemFacade item) throws DataFacadeException { try{ + /*diagnostic code for partial credit + * ArrayList al1= item.getItemTextArray(); + ItemText iText=null; + Iterator it = al1.iterator(); + //we need to figure out what is there in the item; + + while(it.hasNext()){ + iText=(ItemText)it.next(); + } + ArrayList al= iText.getAnswerArray();*/ ItemDataIfc itemdata = (ItemDataIfc) item.getData(); itemdata.setLastModifiedDate(new Date()); itemdata.setLastModifiedBy(AgentFacade.getAgentString()); Index: samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ItemFacade.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ItemFacade.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/facade/ItemFacade.java (revision 201) @@ -79,6 +79,7 @@ protected Float score; protected Float discount; protected String hint; + protected Boolean partialCreditFlag; protected Boolean hasRationale; protected Integer status; protected String createdBy; @@ -517,7 +518,20 @@ this.hasRationale = hasRationale; this.data.setHasRationale(hasRationale); } - + public void setPartialCreditFlag(Boolean partialCreditFlag){ + this.partialCreditFlag=partialCreditFlag; + this.data.setPartialCreditFlag(partialCreditFlag); + + } + public Boolean getPartialCreditFlag(){ + try { + this.data = (ItemDataIfc) item.getData(); + } + catch (AssessmentException ex) { + throw new DataFacadeException(ex.getMessage()); + } + return this.data.getPartialCreditFlag(); + } /** * Get status of ItemFacade. 1 = active, 0 = inactive * @return Index: samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueries.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueries.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/facade/PublishedAssessmentFacadeQueries.java (revision 201) @@ -407,7 +407,7 @@ .getLastModifiedBy(), item.getLastModifiedDate(), null, null, null, // set ItemTextSet, itemMetaDataSet and // itemFeedbackSet later - item.getTriesAllowed()); + item.getTriesAllowed(), item.getPartialCreditFlag()); Set publishedItemTextSet = preparePublishedItemTextSet( publishedItem, item.getItemTextSet()); Set publishedItemMetaDataSet = preparePublishedItemMetaDataSet( @@ -608,7 +608,9 @@ PublishedAnswer publishedAnswer = new PublishedAnswer( publishedItemText, answer.getText(), answer.getSequence(), answer.getLabel(), answer.getIsCorrect(), - answer.getGrade(), answer.getScore(), answer.getDiscount(), null); + answer.getGrade(), answer.getScore(), + answer.getPartialCredit(),//partical credit + answer.getDiscount(), null); Set publishedAnswerFeedbackSet = preparePublishedAnswerFeedbackSet( publishedAnswer, answer.getAnswerFeedbackSet()); publishedAnswer.setAnswerFeedbackSet(publishedAnswerFeedbackSet); Index: samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentFacadeQueries.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentFacadeQueries.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/facade/AssessmentFacadeQueries.java (revision 201) @@ -2110,7 +2110,7 @@ .getLastModifiedBy(), item.getLastModifiedDate(), null, null, null, // set ItemTextSet, itemMetaDataSet and // itemFeedbackSet later - item.getTriesAllowed()); + item.getTriesAllowed(), item.getPartialCreditFlag()); Set newItemTextSet = prepareItemTextSet(newItem, item .getItemTextSet()); Set newItemMetaDataSet = prepareItemMetaDataSet(newItem, item @@ -2272,7 +2272,9 @@ Answer answer = (Answer) l.next(); Answer newAnswer = new Answer(newItemText, answer.getText(), answer .getSequence(), answer.getLabel(), answer.getIsCorrect(), - answer.getGrade(), answer.getScore(), answer.getDiscount(), null); + answer.getGrade(), answer.getScore(), + answer.getPartialCredit(), + answer.getDiscount(), null); Set newAnswerFeedbackSet = prepareAnswerFeedbackSet(newAnswer, answer.getAnswerFeedbackSet()); newAnswer.setAnswerFeedbackSet(newAnswerFeedbackSet); Index: samigo-services/src/java/org/sakaiproject/tool/assessment/facade/QuestionPoolFacadeQueries.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/facade/QuestionPoolFacadeQueries.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/facade/QuestionPoolFacadeQueries.java (revision 201) @@ -51,6 +51,7 @@ import org.sakaiproject.tool.assessment.data.dao.questionpool.QuestionPoolItemData; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemDataIfc; import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemMetaDataIfc; +import org.sakaiproject.tool.assessment.data.ifc.assessment.ItemTextIfc; import org.sakaiproject.tool.assessment.data.model.Tree; import org.sakaiproject.tool.assessment.osid.shared.impl.IdImpl; import org.sakaiproject.tool.assessment.services.ItemService; @@ -1352,9 +1353,22 @@ Iterator answerIter = fromAnswerSet.iterator(); while (answerIter.hasNext()) { Answer fromAnswer = (Answer) answerIter.next(); - Answer toAnswer = new Answer(toItemText, fromAnswer.getText(), fromAnswer.getSequence(), fromAnswer.getLabel(), - fromAnswer.getIsCorrect(), fromAnswer.getGrade(), fromAnswer.getScore(), fromAnswer.getDiscount()); - + Answer toAnswer = new Answer(toItemText, + fromAnswer.getText(), fromAnswer.getSequence(), fromAnswer.getLabel(), + fromAnswer.getIsCorrect(), fromAnswer.getGrade(), fromAnswer.getScore(), + fromAnswer.getPartialCredit(), + fromAnswer.getDiscount()); + /* + * public Answer( + * ItemTextIfc itemText, + * String text, + * Long sequence, + * String label, + Boolean isCorrect, + String grade, + Float score, + Float partialCredit, + Float discount) */ HashSet toAnswerFeedbackSet = new HashSet(); Set fromAnswerFeedbackSet = fromAnswer.getAnswerFeedbackSet(); Iterator answerFeedbackIter = fromAnswerFeedbackSet.iterator(); Index: samigo-services/src/java/org/sakaiproject/tool/assessment/services/ItemService.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/services/ItemService.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/services/ItemService.java (revision 201) @@ -235,7 +235,9 @@ item.getDescription(),item.getTypeId(),item.getGrade(),item.getScore(), item.getDiscount(), item.getHint(),item.getHasRationale(),item.getStatus(),item.getCreatedBy(), item.getCreatedDate(),item.getLastModifiedBy(),item.getLastModifiedDate(), - null, null, null, item.getTriesAllowed()); + null, null, null, item.getTriesAllowed(), item.getPartialCreditFlag() + + ); // perform deep copy, set ItemTextSet, itemMetaDataSet and itemFeedbackSet Set newItemTextSet = copyItemTextSet(cloned, item.getItemTextSet()); @@ -271,7 +273,9 @@ Answer newAnswer = new Answer( newItemText, answer.getText(), answer.getSequence(), answer.getLabel(), - answer.getIsCorrect(), answer.getGrade(), answer.getScore(), answer.getDiscount(), null); + answer.getIsCorrect(), answer.getGrade(), answer.getScore(), + answer.getPartialCredit(), + answer.getDiscount(), null); Set newAnswerFeedbackSet = copyAnswerFeedbackSet( newAnswer, answer.getAnswerFeedbackSet()); newAnswer.setAnswerFeedbackSet(newAnswerFeedbackSet); Index: samigo-services/src/java/org/sakaiproject/tool/assessment/services/PersistenceService.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/services/PersistenceService.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/services/PersistenceService.java (revision 201) @@ -213,6 +213,8 @@ } catch(InterruptedException ex){ log.warn(ex.getMessage()); + ex.printStackTrace(); + } } else retryCount = 0; Index: samigo-services/src/java/org/sakaiproject/tool/assessment/services/GradingService.java =================================================================== --- samigo-services/src/java/org/sakaiproject/tool/assessment/services/GradingService.java (revision 180) +++ samigo-services/src/java/org/sakaiproject/tool/assessment/services/GradingService.java (revision 201) @@ -888,7 +888,17 @@ Long itemId = item.getItemId(); int type = itemType.intValue(); switch (type){ - case 1: // MC Single Correct + case 1: + if(item.getPartialCreditFlag()) + autoScore = getAnswerScoreMCQ(itemGrading, publishedAnswerHash); + else{ + autoScore = getAnswerScore(itemGrading, publishedAnswerHash); + } + //overridescore + if (itemGrading.getOverrideScore() != null) + autoScore += itemGrading.getOverrideScore().floatValue(); + totalItems.put(itemId, new Float(autoScore)); + break;// MC Single Correct case 12: // MC Multiple Correct Single Selection case 3: // MC Survey case 4: // True/False @@ -1019,6 +1029,8 @@ { // return (float) 0; // Para que descuente (For discount) + + if ((TypeIfc.MULTIPLE_CHOICE).equals(itemType)||(TypeIfc.TRUE_FALSE).equals(itemType)){ return (answer.getDiscount().floatValue() * ((float) -1)); }else{ @@ -1027,7 +1039,28 @@ } return answer.getScore().floatValue(); } - + /** + * This grades multiple choice and true false questions. Since + * multiple choice/multiple select has a separate ItemGradingIfc for + * each choice, they're graded the same way the single choice are. + * BUT since we have Partial Credit stuff around we have to have a separate method here --mustansar + * Choices should be given negative score values if one wants them + * to lose points for the wrong choice. + */ + public float getAnswerScoreMCQ(ItemGradingIfc data, HashMap publishedAnswerHash) + { + AnswerIfc answer = (AnswerIfc) publishedAnswerHash.get(data.getPublishedAnswerId()); + if (answer == null || answer.getScore() == null) + return (float) 0; + + else if (answer.getIsCorrect().booleanValue()){ // instead of using answer score Item score needs to be used here + return (answer.getItem().getScore().floatValue()); //--mustansar + } + return (answer.getItem().getScore().floatValue()*answer.getPartialCredit().floatValue())/(new Float(100.0).floatValue()); + } + + + public void notifyGradebook(AssessmentGradingIfc data, PublishedAssessmentIfc pub) throws GradebookServiceException { // If the assessment is published to the gradebook, make sure to update the scores in the gradebook String toGradebook = pub.getEvaluationModel().getToGradeBook(); Index: samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/helper/ExtractionHelper.java =================================================================== --- samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/helper/ExtractionHelper.java (revision 180) +++ samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/helper/ExtractionHelper.java (revision 201) @@ -1283,6 +1283,7 @@ String hasRationale = item.getItemMetaDataByLabel("hasRationale");//rshastri :SAK-1824 String status = (String) itemMap.get("status"); String createdBy = (String) itemMap.get("createdBy"); + String partialCreditFlag= (String)itemMap.get("PARTIAL_CREDIT"); // created by is not nullable if (createdBy == null) @@ -1320,7 +1321,15 @@ else { item.setDiscount(Float.valueOf(0)); } - + + if (notNullOrEmpty( partialCreditFlag)) + { + item.setPartialCreditFlag((Boolean.parseBoolean( partialCreditFlag))); + } + else { + item.setPartialCreditFlag((Boolean.FALSE)); + } + item.setHint( (String) itemMap.get("hint")); if (notNullOrEmpty(hasRationale)) { @@ -1444,6 +1453,10 @@ List answerList = new ArrayList(); List aList = (List) itemMap.get("itemAnswer"); answerList = aList == null ? answerList : aList; + boolean MCSC=itemMap.get("itemIntrospect").equals("Multiple Choice"); + List answerScoreList=new ArrayList();//--mustansar + List sList = (List) itemMap.get("answerScore");//--mustansar + answerScoreList = sList == null ? answerScoreList : sList; //--mustansar HashSet answerSet = new HashSet(); char answerLabel = 'A'; List answerFeedbackList = (List) itemMap.get("itemAnswerFeedback"); @@ -1519,7 +1532,20 @@ answer.setAnswerFeedbackSet(set); } } - + if(MCSC){ + long index =answer.getSequence().longValue(); + index=index - 1L; + int indexInteger= new Long(index).intValue(); + String strPCredit= (String)answerScoreList.get(indexInteger ); + float fltPCredit=new Float(strPCredit).floatValue(); + Float pCredit=(fltPCredit/(item.getScore().floatValue()))*100; + if( pCredit.isNaN()){ + answer.setPartialCredit(new Float(0.0)); + }else{ + answer.setPartialCredit(pCredit); + } + } + // if(answer.getPartialCredit()) answerSet.add(answer); } } Index: samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/helper/item/ItemHelper12Impl.java =================================================================== --- samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/helper/item/ItemHelper12Impl.java (revision 180) +++ samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/helper/item/ItemHelper12Impl.java (revision 201) @@ -1614,8 +1614,25 @@ isInsert = false; } - addAnswerFeedback(itemXml, value, - isInsert, xpathIndex, "" + label); + //addAnswerFeedback(itemXml, value, isInsert, xpathIndex, "" + label); + if(itemXml.isMCSC()){ + //MC Single Correct + if(answer.getIsCorrect().booleanValue()){ + answer.setPartialCredit(new Float(100.0)); + addAnswerFeedbackPartialCredit(itemXml, value, + isInsert, xpathIndex, "" + label , new Float(((answer.getItem().getScore().floatValue())*answer.getPartialCredit().floatValue())/(new Float(100.0).floatValue()))); + }//may have to move to itemAddListener.java --mustansar + else { + + addAnswerFeedbackPartialCredit(itemXml, value, + isInsert, xpathIndex, "" + label , new Float(((answer.getItem().getScore().floatValue())*answer.getPartialCredit().floatValue())/(new Float(100.0)).floatValue())); //--mustansar + } + } + else + { // for MC Mulitiple Correct + addAnswerFeedback(itemXml, value, + isInsert, xpathIndex, "" + label ); + } label++; xpathIndex++; } @@ -1625,7 +1642,35 @@ } } - + /** + * Adds feedback with ident referencing answer ident. + * + * @param itemXml + * @param value + * @param isInsert + * @param responseNo + * @param responseLabel + */ + private void addAnswerFeedbackPartialCredit(Item itemXml, String value, + boolean isInsert, int responseNo, + String responseLabel, Float partialCredit) + { + log.debug("addAnswerFeedback()"); + log.debug("answer feedback value: " + value); + if (value == null) { + value = ""; + } + else { + value = ""; + } + String respCond = "item/resprocessing/respcondition[" + responseNo + "]"; + + // updateItemXml(itemXml, respCond + "/setvar", "" + currentPerItemScore); + updateItemXml(itemXml, respCond + "/setvar", "" + partialCredit); + updateItemXml(itemXml, + respCond + "/displayfeedback[2]/@linkrefid", "AnswerFeedback"); + updateItemXml(itemXml, respCond + "/displayfeedback[2]", value); + } /** * Adds feedback with idents of Correct and InCorrect * @param itemXml Index: samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/asi/Item.java =================================================================== --- samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/asi/Item.java (revision 180) +++ samigo-qti/src/java/org/sakaiproject/tool/assessment/qti/asi/Item.java (revision 201) @@ -183,6 +183,12 @@ { setFieldentry("hasRationale", item.getHasRationale().toString()); } + if(item.getTypeId().equals(TypeIfc.MULTIPLE_CHOICE)&&item.getPartialCreditFlag()){ + setFieldentry("PARTIAL_CREDIT", "TRUE"); + + }else{ + setFieldentry("PARTIAL_CREDIT", "FALSE"); + } // rshastri: SAK-1824 // item data // ItemHelper helper = new ItemHelper(); Index: samigo-audio/.classpath =================================================================== --- samigo-audio/.classpath (revision 180) +++ samigo-audio/.classpath (revision 201) @@ -1,7 +1,7 @@ - + - + \ No newline at end of file Index: samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedItemData.hbm.xml =================================================================== --- samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedItemData.hbm.xml (revision 180) +++ samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedItemData.hbm.xml (revision 201) @@ -25,6 +25,7 @@ + @@ -105,6 +106,8 @@ + + Index: samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ItemData.hbm.xml =================================================================== --- samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ItemData.hbm.xml (revision 180) +++ samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ItemData.hbm.xml (revision 201) @@ -22,6 +22,8 @@ + + @@ -116,6 +118,7 @@ + Index: samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/Answer.java =================================================================== --- samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/Answer.java (revision 180) +++ samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/Answer.java (revision 201) @@ -50,13 +50,15 @@ private String grade; private Float score; private Float discount; + private Float partialCredit=new Float(0.0); //--mustansar + // private boolean partialCreditFlag ; private Set answerFeedbackSet; private HashMap answerFeedbackMap; private ItemData dat=new ItemData(); public Answer() {} public Answer(ItemTextIfc itemText, String text, Long sequence, String label, - Boolean isCorrect, String grade, Float score, Float discount) { + Boolean isCorrect, String grade, Float score, Float partialCredit, Float discount) { this.itemText = itemText; this.item = itemText.getItem(); this.text = text; @@ -65,11 +67,13 @@ this.isCorrect = isCorrect; this.grade = grade; this.score = score; + this.partialCredit=partialCredit; this.discount=discount; + } public Answer(ItemTextIfc itemText, String text, Long sequence, String label, - Boolean isCorrect, String grade, Float score, Float discount, + Boolean isCorrect, String grade, Float score, Float partialCredit,Float discount, Set answerFeedbackSet) { this.itemText = itemText; this.item = itemText.getItem(); @@ -79,10 +83,18 @@ this.isCorrect = isCorrect; this.grade = grade; this.score = score; + this.partialCredit=partialCredit; this.discount=discount; this.answerFeedbackSet = answerFeedbackSet; } - + //--mustansar for partial credit + public Float getPartialCredit(){ + return this.partialCredit; + } + public void setPartialCredit(Float pCredit ){ + this.partialCredit=pCredit; + } + public Long getId() { return id; } Index: samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedAnswer.java =================================================================== --- samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedAnswer.java (revision 180) +++ samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedAnswer.java (revision 201) @@ -49,6 +49,7 @@ private String grade; private Float score; private Float discount; + private Float partialCredit; //partial credit private Set answerFeedbackSet; private HashMap answerFeedbackMap; private PublishedItemData publishedItemData = new PublishedItemData(); @@ -56,7 +57,7 @@ public PublishedAnswer() {} public PublishedAnswer(ItemTextIfc itemText, String text, Long sequence, String label, - Boolean isCorrect, String grade, Float score, Float discount) { + Boolean isCorrect, String grade, Float score, Float partialCredit,Float discount) { this.itemText = itemText; this.item = itemText.getItem(); this.text = text; @@ -66,10 +67,11 @@ this.grade = grade; this.score = score; this.discount = discount; + this.partialCredit=partialCredit; } public PublishedAnswer(ItemTextIfc itemText, String text, Long sequence, String label, - Boolean isCorrect, String grade, Float score, Float discount, + Boolean isCorrect, String grade, Float score,Float partialCredit, Float discount, Set answerFeedbackSet) { this.itemText = itemText; this.item = itemText.getItem(); @@ -81,8 +83,15 @@ this.score = score; this.discount = discount; this.answerFeedbackSet = answerFeedbackSet; + this.partialCredit=partialCredit; } - + //--mustansar for partial credit + public Float getPartialCredit(){ + return partialCredit; + } + public void setPartialCredit(Float pCredit ){ + this.partialCredit=pCredit; + } public Long getId() { return id; } Index: samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedItemData.java =================================================================== --- samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedItemData.java (revision 180) +++ samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/PublishedItemData.java (revision 201) @@ -64,6 +64,7 @@ private Float discount; private String hint; private Boolean hasRationale; + private Integer status; private String createdBy; private Date createdDate; @@ -76,8 +77,17 @@ private HashMap itemFeedbackMap = new HashMap(); private ItemGradingData lastItemGradingDataByAgent; private Set itemAttachmentSet; + private Boolean partialCreditFlag; + + public Boolean getPartialCreditFlag() { + return partialCreditFlag; +} + +public void setPartialCreditFlag(Boolean partialCreditFlag) { + this.partialCreditFlag = partialCreditFlag; +} - public PublishedItemData() {} +public PublishedItemData() {} // this constructor should be deprecated, it is missing triesAllowed public PublishedItemData(SectionDataIfc section, Integer sequence, @@ -86,7 +96,7 @@ Boolean hasRationale, Integer status, String createdBy, Date createdDate, String lastModifiedBy, Date lastModifiedDate, - Set itemTextSet, Set itemMetaDataSet, Set itemFeedbackSet) { + Set itemTextSet, Set itemMetaDataSet, Set itemFeedbackSet, Boolean partialCrditFlag) { this.section = section; this.sequence = sequence; this.duration = duration; @@ -106,6 +116,7 @@ this.itemTextSet = itemTextSet; this.itemMetaDataSet = itemMetaDataSet; this.itemFeedbackSet = itemFeedbackSet; + this.partialCreditFlag=partialCreditFlag; } public PublishedItemData(SectionDataIfc section, Integer sequence, @@ -115,7 +126,7 @@ Date createdDate, String lastModifiedBy, Date lastModifiedDate, Set itemTextSet, Set itemMetaDataSet, Set itemFeedbackSet, - Integer triesAllowed) { + Integer triesAllowed, Boolean partialCreditFlag) { this.section = section; this.sequence = sequence; this.duration = duration; @@ -136,8 +147,10 @@ this.itemMetaDataSet = itemMetaDataSet; this.itemFeedbackSet = itemFeedbackSet; this.triesAllowed = triesAllowed; + this.partialCreditFlag=partialCreditFlag; } + public Long getItemId() { return this.itemId; } @@ -679,4 +692,12 @@ return list; } +/*public Boolean getPartialCreditFlag() { + return partialCreditFlag; +} + +public void setPartialCreditFlag(Boolean partialCreditFlag) { + this.partialCreditFlag = partialCreditFlag; +}*/ + } Index: samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ItemData.java =================================================================== --- samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ItemData.java (revision 180) +++ samigo-hibernate/src/java/org/sakaiproject/tool/assessment/data/dao/assessment/ItemData.java (revision 201) @@ -43,7 +43,8 @@ private Float discount; private String hint; private Boolean hasRationale; - private Integer status; + private Boolean partialCreditFlag; + private Integer status; private String createdBy; private Date createdDate; private String lastModifiedBy; @@ -54,6 +55,7 @@ private HashMap itemMetaDataMap = new HashMap(); private HashMap itemFeedbackMap; private Set itemAttachmentSet; + // private Float partialCredit; public ItemData() {} @@ -64,7 +66,9 @@ Boolean hasRationale, Integer status, String createdBy, Date createdDate, String lastModifiedBy, Date lastModifiedDate, - Set itemTextSet, Set itemMetaDataSet, Set itemFeedbackSet) { + Set itemTextSet, Set itemMetaDataSet, Set itemFeedbackSet, Boolean partialCreditFlag + //, Float partialCredit + ) { this.section = section; this.sequence = sequence; this.duration = duration; @@ -84,6 +88,9 @@ this.itemTextSet = itemTextSet; this.itemMetaDataSet = itemMetaDataSet; this.itemFeedbackSet = itemFeedbackSet; + this.partialCreditFlag=partialCreditFlag; + // this.partialCredit=partialCredit; + } public ItemData(SectionDataIfc section, Integer sequence, @@ -93,7 +100,9 @@ Date createdDate, String lastModifiedBy, Date lastModifiedDate, Set itemTextSet, Set itemMetaDataSet, Set itemFeedbackSet, - Integer triesAllowed) { + Integer triesAllowed, Boolean partialCreditFlag + //, Float partialCredit + ) { this.section = section; this.sequence = sequence; this.duration = duration; @@ -114,9 +123,19 @@ this.itemMetaDataSet = itemMetaDataSet; this.itemFeedbackSet = itemFeedbackSet; this.triesAllowed = triesAllowed; + this.partialCreditFlag=partialCreditFlag; + //this.partialCredit=partialCredit; } - /* + //public Float getPartialCredit() { + //return this.partialCredit; +//} + +//public void setPartialCredit(Float partialCredit) { + //this.partialCredit = partialCredit; +//} + +/* public Object clone() throws CloneNotSupportedException{ ItemData cloned= new ItemData( @@ -206,25 +225,19 @@ } */ - - public Long getItemId() { - return this.itemId; - } - + return this.itemId; + } public void setItemId(Long itemId) { this.itemId = itemId; setItemIdString(itemId.toString()); } - public String getItemIdString() { return this.itemIdString; } - public void setItemIdString(String itemIdString) { this.itemIdString = itemIdString; } - public SectionDataIfc getSection() { return this.section; } @@ -760,7 +773,10 @@ } return list; } - - - +public Boolean getPartialCreditFlag() { + return this.partialCreditFlag; +} +public void setPartialCreditFlag(Boolean particalCreditFlag) { + this.partialCreditFlag=particalCreditFlag; +} }