Index: lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java =================================================================== diff -u -ra2b41bfd7ae2b33847ddbc9d9c46e18b30272905 -rfcb79f2ce8462f39e3132b2a65f779f05b0274c7 --- lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java (.../EditQbQuestionController.java) (revision a2b41bfd7ae2b33847ddbc9d9c46e18b30272905) +++ lams_central/src/java/org/lamsfoundation/lams/web/qb/EditQbQuestionController.java (.../EditQbQuestionController.java) (revision fcb79f2ce8462f39e3132b2a65f779f05b0274c7) @@ -480,9 +480,6 @@ option.setName(name); float maxMark = Float.valueOf(paramMap.get(QbConstants.ATTR_OPTION_MAX_MARK_PREFIX + i)); option.setMaxMark(maxMark); - if (maxMark == 1.0) { - option.setCorrect(true); - } option.setFeedback(paramMap.get(QbConstants.ATTR_OPTION_FEEDBACK_PREFIX + i)); } else if (questionType == QbQuestion.TYPE_MATCHING_PAIRS) { Index: lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql =================================================================== diff -u -r2f71a2101beb910d632a05daa150557060a39d7d -rfcb79f2ce8462f39e3132b2a65f779f05b0274c7 --- lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision 2f71a2101beb910d632a05daa150557060a39d7d) +++ lams_common/src/java/org/lamsfoundation/lams/dbupdates/patch20190110.sql (.../patch20190110.sql) (revision fcb79f2ce8462f39e3132b2a65f779f05b0274c7) @@ -46,7 +46,6 @@ `qb_question_uid` BIGINT NOT NULL, `display_order` TINYINT NOT NULL DEFAULT 1, `name` TEXT, - `correct` TINYINT(1) NOT NULL DEFAULT 0, `matching_pair` TEXT, `numerical_option` float DEFAULT 0, `max_mark` float DEFAULT 0, @@ -152,7 +151,7 @@ DROP COLUMN feedback; -- fill table with options matching unique QB questions inserted above -INSERT INTO lams_qb_option (qb_question_uid, display_order, name, correct) +INSERT INTO lams_qb_option (qb_question_uid, display_order, name, max_mark) SELECT q.uid, o.displayOrder, o.mc_que_option_text, o.correct_option FROM tl_lamc11_options_content AS o JOIN lams_qb_question AS q @@ -325,7 +324,7 @@ -- fill table with options matching unique QB questions inserted above -INSERT INTO lams_qb_option (qb_question_uid, display_order, name, correct) +INSERT INTO lams_qb_option (qb_question_uid, display_order, name, max_mark) SELECT q.uid, o.order_id, o.description, o.correct FROM tl_lascrt11_scratchie_answer AS o JOIN lams_qb_question AS q @@ -450,7 +449,7 @@ ON q.uid = m.qb_question_uid JOIN tl_laasse10_assessment_question AS aq ON aq.uid = m.question_uid - SET q.name = TRIM(aq.question); + SET q.name = TRIM(aq.title); -- create a mapping of Assessment question UID -> UID of one of Assessment questions which holds the same content INSERT INTO tmp_question_match @@ -595,8 +594,8 @@ DROP TABLE tmp_assessment_option; -- fill table with options matching unique QB questions inserted above -INSERT INTO lams_qb_option (qb_question_uid, display_order, name, correct, matching_pair, numerical_option, max_mark, accepted_error, feedback) - SELECT q.uid, o.sequence_id, IFNULL(o.option_string, ''), o.correct OR o.grade > 0, o.question, o.option_float, +INSERT INTO lams_qb_option (qb_question_uid, display_order, name, matching_pair, numerical_option, max_mark, accepted_error, feedback) + SELECT q.uid, o.sequence_id, IFNULL(o.option_string, ''), o.question, o.option_float, o.grade, o.accepted_error, o.feedback FROM tl_laasse10_question_option AS o JOIN lams_qb_question AS q @@ -626,6 +625,7 @@ AND qo.qb_question_uid = tq.qb_question_uid AND o.question_uid = tq.tool_question_uid; + -- prepare for updating option IDs in tl_laasse10_option_answer CREATE TABLE tmp_option_answer SELECT DISTINCT sa.question_option_uid, qo.uid @@ -645,7 +645,6 @@ ALTER TABLE tl_laasse10_option_answer DROP FOREIGN KEY FK_tl_laasse10_option_answer_2; - -- proper update UPDATE tl_laasse10_option_answer AS sa, tmp_option_answer AS t SET sa.question_option_uid = t.uid Index: lams_common/src/java/org/lamsfoundation/lams/qb/model/QbOption.java =================================================================== diff -u -r9c3a64b840753192b333afb73c8fe7bdb54be638 -rfcb79f2ce8462f39e3132b2a65f779f05b0274c7 --- lams_common/src/java/org/lamsfoundation/lams/qb/model/QbOption.java (.../QbOption.java) (revision 9c3a64b840753192b333afb73c8fe7bdb54be638) +++ lams_common/src/java/org/lamsfoundation/lams/qb/model/QbOption.java (.../QbOption.java) (revision fcb79f2ce8462f39e3132b2a65f779f05b0274c7) @@ -1,173 +1,170 @@ -package org.lamsfoundation.lams.qb.model; - -import java.io.Serializable; - -import javax.persistence.Column; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; -import javax.persistence.JoinColumn; -import javax.persistence.ManyToOne; -import javax.persistence.Table; - -import org.apache.commons.lang.builder.EqualsBuilder; -import org.apache.commons.lang.builder.HashCodeBuilder; - -/** - * One of possible answers for a question in Question Bank. - * - * @author Marcin Cieslak - */ -@Entity -@Table(name = "lams_qb_option") -public class QbOption implements Serializable, Cloneable, Comparable { - private static final long serialVersionUID = -2354311780882736829L; - - @Id - @Column - @GeneratedValue(strategy = GenerationType.IDENTITY) - Long uid; - - @Column - private String name; - - @Column - private boolean correct = false; - - @Column(name = "display_order") - private int displayOrder = 1; - - @ManyToOne(optional = false) - @JoinColumn(name = "qb_question_uid") - private QbQuestion qbQuestion; - - // ********************************************************** - // Properties used only in Assessment - // ********************************************************** - - @Column(name = "matching_pair") - private String matchingPair; - - @Column(name = "numerical_option") - private float numericalOption; - - @Column(name = "max_mark") - private float maxMark; - - @Column(name = "accepted_error") - private float acceptedError; - - @Column - private String feedback; - - @Override - public QbOption clone() { - QbOption clone = null; - try { - clone = (QbOption) super.clone(); - clone.qbQuestion = null; - } catch (CloneNotSupportedException e) { - // it should never happen - e.printStackTrace(); - } - return clone; - } - - @Override - public boolean equals(Object o) { - QbOption other = (QbOption) o; - return new EqualsBuilder().append(this.name, other.name).append(this.correct, other.correct) - .append(this.displayOrder, other.displayOrder).isEquals(); - } - - @Override - public int hashCode() { - return new HashCodeBuilder().append(this.name).append(this.correct).toHashCode(); - } - - @Override - public int compareTo(QbOption o) { - return Integer.compare(this.displayOrder, o.displayOrder); - } - - public Long getUid() { - return uid; - } - - public void setUid(Long uid) { - this.uid = uid; - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public boolean isCorrect() { - return correct; - } - - public void setCorrect(boolean correct) { - this.correct = correct; - } - - public int getDisplayOrder() { - return displayOrder; - } - - public void setDisplayOrder(int displayOrder) { - this.displayOrder = displayOrder; - } - - public QbQuestion getQbQuestion() { - return qbQuestion; - } - - public void setQbQuestion(QbQuestion question) { - this.qbQuestion = question; - } - - public String getMatchingPair() { - return matchingPair; - } - - public void setMatchingPair(String matchingPair) { - this.matchingPair = matchingPair; - } - - public float getNumericalOption() { - return numericalOption; - } - - public void setNumericalOption(float numericalOption) { - this.numericalOption = numericalOption; - } - - public float getAcceptedError() { - return acceptedError; - } - - public void setAcceptedError(float acceptedError) { - this.acceptedError = acceptedError; - } - - public float getMaxMark() { - return maxMark; - } - - public void setMaxMark(float maxMark) { - this.maxMark = maxMark; - } - - public String getFeedback() { - return feedback; - } - - public void setFeedback(String feedback) { - this.feedback = feedback; - } +package org.lamsfoundation.lams.qb.model; + +import java.io.Serializable; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.Table; + +import org.apache.commons.lang.builder.EqualsBuilder; +import org.apache.commons.lang.builder.HashCodeBuilder; + +/** + * One of possible answers for a question in Question Bank. + * + * @author Marcin Cieslak + */ +@Entity +@Table(name = "lams_qb_option") +public class QbOption implements Serializable, Cloneable, Comparable { + private static final long serialVersionUID = -2354311780882736829L; + + @Id + @Column + @GeneratedValue(strategy = GenerationType.IDENTITY) + Long uid; + + @Column + private String name; + + @Column(name = "display_order") + private int displayOrder = 1; + + @ManyToOne(optional = false) + @JoinColumn(name = "qb_question_uid") + private QbQuestion qbQuestion; + + // ********************************************************** + // Properties used only in Assessment + // ********************************************************** + + @Column(name = "matching_pair") + private String matchingPair; + + @Column(name = "numerical_option") + private float numericalOption; + + @Column(name = "max_mark") + private float maxMark; + + @Column(name = "accepted_error") + private float acceptedError; + + @Column + private String feedback; + + @Override + public QbOption clone() { + QbOption clone = null; + try { + clone = (QbOption) super.clone(); + clone.qbQuestion = null; + } catch (CloneNotSupportedException e) { + // it should never happen + e.printStackTrace(); + } + return clone; + } + + @Override + public boolean equals(Object o) { + QbOption other = (QbOption) o; + return new EqualsBuilder().append(this.name, other.name).append(this.maxMark, other.maxMark) + .append(this.displayOrder, other.displayOrder).isEquals(); + } + + @Override + public int hashCode() { + return new HashCodeBuilder().append(this.name).append(this.maxMark).toHashCode(); + } + + @Override + public int compareTo(QbOption o) { + return Integer.compare(this.displayOrder, o.displayOrder); + } + + public Long getUid() { + return uid; + } + + public void setUid(Long uid) { + this.uid = uid; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isCorrect() { + return this.maxMark == 1f; + } + + public void setCorrect(boolean correct) { + this.maxMark = correct ? 1 : 0; + } + + public int getDisplayOrder() { + return displayOrder; + } + + public void setDisplayOrder(int displayOrder) { + this.displayOrder = displayOrder; + } + + public QbQuestion getQbQuestion() { + return qbQuestion; + } + + public void setQbQuestion(QbQuestion question) { + this.qbQuestion = question; + } + + public String getMatchingPair() { + return matchingPair; + } + + public void setMatchingPair(String matchingPair) { + this.matchingPair = matchingPair; + } + + public float getNumericalOption() { + return numericalOption; + } + + public void setNumericalOption(float numericalOption) { + this.numericalOption = numericalOption; + } + + public float getAcceptedError() { + return acceptedError; + } + + public void setAcceptedError(float acceptedError) { + this.acceptedError = acceptedError; + } + + public float getMaxMark() { + return maxMark; + } + + public void setMaxMark(float maxMark) { + this.maxMark = maxMark; + } + + public String getFeedback() { + return feedback; + } + + public void setFeedback(String feedback) { + this.feedback = feedback; + } } \ No newline at end of file