From da4a0a9b2c60712f93134540dbc6ce9311a4bdb7 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Tue, 10 Mar 2020 12:19:11 +0100
Subject: [PATCH] OO-4559: allow participant to change review settings in
 portfolio

Allow the participants to change the assignment reviewers settings of an
assignment template
---
 .../modules/portfolio/PortfolioService.java   |  7 ++-
 .../portfolio/manager/AssignmentDAO.java      | 12 +++-
 .../modules/portfolio/manager/BinderDAO.java  |  4 +-
 .../manager/PortfolioServiceImpl.java         |  6 +-
 .../ui/AssignmentEditController.java          |  4 +-
 .../ui/PageMetadataEditController.java        | 57 ++++++++++++++++++-
 .../portfolio/manager/AssignmentDAOTest.java  |  2 +-
 7 files changed, 79 insertions(+), 13 deletions(-)

diff --git a/src/main/java/org/olat/modules/portfolio/PortfolioService.java b/src/main/java/org/olat/modules/portfolio/PortfolioService.java
index 26caadd8331..b4e467cda10 100644
--- a/src/main/java/org/olat/modules/portfolio/PortfolioService.java
+++ b/src/main/java/org/olat/modules/portfolio/PortfolioService.java
@@ -198,10 +198,15 @@ public interface PortfolioService {
 	 * @param imagePath The path of the image
 	 * @param align Alignment of the image
 	 * @param section The section (mandatory)
+	 * @param onlyAutoEvaluation If the assignment is only for auto evaluation or
+	 * 		external review is allowed (only form)
+	 * @param reviewerCanSeeAutoEvaluation If the reviewers can see the auto
+	 * 		evaluation (only form)
 	 * @return The page created for the assignment
 	 */
 	public Page startAssignmentFromTemplate(Long assignmentKey, Identity author,
-			String title, String summary, String imagePath, PageImageAlign align, SectionRef section);
+			String title, String summary, String imagePath, PageImageAlign align, SectionRef section,
+			Boolean onlyAutoEvaluation, Boolean reviewerCanSeeAutoEvaluation);
 	
 	/**
 	 * Add a new section at the end of the sections list of the specified binder.
diff --git a/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java b/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java
index 0fd19de36f5..d162eca160c 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/AssignmentDAO.java
@@ -105,7 +105,8 @@ public class AssignmentDAO {
 		return assignment;
 	}
 	
-	public Assignment createAssignment(Assignment templateReference, AssignmentStatus status, Section section, Binder binder, boolean template) {
+	public Assignment createAssignment(Assignment templateReference, AssignmentStatus status, Section section, Binder binder,
+			boolean template, Boolean onlyAutoEvaluation, Boolean reviewerSeeAutoEvaluation) {
 		AssignmentImpl assignment = new AssignmentImpl();
 		assignment.setCreationDate(new Date());
 		assignment.setLastModified(assignment.getCreationDate());
@@ -118,8 +119,13 @@ public class AssignmentDAO {
 		assignment.setType(templateReference.getAssignmentType().name());
 		assignment.setTemplateReference(templateReference);
 		assignment.setStatus(status.name());
-		assignment.setOnlyAutoEvaluation(templateReference.isOnlyAutoEvaluation());
-		assignment.setReviewerSeeAutoEvaluation(templateReference.isReviewerSeeAutoEvaluation());
+		if(onlyAutoEvaluation != null) {
+			assignment.setOnlyAutoEvaluation(onlyAutoEvaluation.booleanValue());
+			assignment.setReviewerSeeAutoEvaluation(reviewerSeeAutoEvaluation != null && reviewerSeeAutoEvaluation.booleanValue());
+		} else {
+			assignment.setOnlyAutoEvaluation(templateReference.isOnlyAutoEvaluation());
+			assignment.setReviewerSeeAutoEvaluation(templateReference.isReviewerSeeAutoEvaluation());
+		}
 		assignment.setAnonymousExternalEvaluation(templateReference.isAnonymousExternalEvaluation());
 		assignment.setStorage(templateReference.getStorage());
 		assignment.setFormEntry(templateReference.getFormEntry());
diff --git a/src/main/java/org/olat/modules/portfolio/manager/BinderDAO.java b/src/main/java/org/olat/modules/portfolio/manager/BinderDAO.java
index 89184885b84..faa4cc5c5b2 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/BinderDAO.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/BinderDAO.java
@@ -270,7 +270,7 @@ public class BinderDAO {
 		syncAssignmentsList(templateAssignments, currentAssignments, currentSection);
 		for(Assignment templateAssignment:templateAssignments) {
 			if(templateAssignment != null) {
-				assignmentDao.createAssignment(templateAssignment, AssignmentStatus.notStarted, currentSection, null, templateAssignment.isTemplate());
+				assignmentDao.createAssignment(templateAssignment, AssignmentStatus.notStarted, currentSection, null, templateAssignment.isTemplate(), null, null);
 			}
 		}
 	}
@@ -281,7 +281,7 @@ public class BinderDAO {
 		syncAssignmentsList(templateAssignments, currentAssignments, currentBinder);
 		for(Assignment templateAssignment:templateAssignments) {
 			if(templateAssignment != null) {
-				assignmentDao.createAssignment(templateAssignment, AssignmentStatus.notStarted, null, currentBinder, templateAssignment.isTemplate());
+				assignmentDao.createAssignment(templateAssignment, AssignmentStatus.notStarted, null, currentBinder, templateAssignment.isTemplate(), null, null);
 			}
 		}
 	}
diff --git a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
index 6bed5e5aa7a..edb4b73e3a8 100644
--- a/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
+++ b/src/main/java/org/olat/modules/portfolio/manager/PortfolioServiceImpl.java
@@ -521,12 +521,14 @@ public class PortfolioServiceImpl implements PortfolioService {
 	}
 	
 	@Override
-	public Page startAssignmentFromTemplate(Long assignmentKey, Identity author, String title, String summary, String imagePath, PageImageAlign align, SectionRef sectionRef) {
+	public Page startAssignmentFromTemplate(Long assignmentKey, Identity author, String title, String summary, String imagePath, PageImageAlign align,
+			SectionRef sectionRef, Boolean onlyAutoEvaluation, Boolean reviewerCanSeeAutoEvaluation) {
 		Page page = null;
 		Section section = binderDao.loadSectionByKey(sectionRef.getKey());
 		Assignment reloadedAssignmentTemplate = assignmentDao.loadAssignmentByKey(assignmentKey);
 		Assignment instanciatedAssignment = assignmentDao
-				.createAssignment(reloadedAssignmentTemplate, AssignmentStatus.inProgress, section, null, false);
+				.createAssignment(reloadedAssignmentTemplate, AssignmentStatus.inProgress, section, null,
+						false, onlyAutoEvaluation, reviewerCanSeeAutoEvaluation);
 		if (instanciatedAssignment.getPage() == null) {
 			if (instanciatedAssignment.getAssignmentType() == AssignmentType.essay
 					|| instanciatedAssignment.getAssignmentType() == AssignmentType.document) {
diff --git a/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java b/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
index 11fdafa1ff9..b0980b00784 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/AssignmentEditController.java
@@ -91,8 +91,8 @@ public class AssignmentEditController extends FormBasicController {
 			AssignmentType.document, AssignmentType.form
 	};
 
-	public static final String[] onKeys = new String[] { "on" };
-	public static final String[] evaKeys = new String[] { "only-autoevaluation", "alien-evaluation"};
+	private static final String[] onKeys = new String[] { "on" };
+	private static final String[] evaKeys = new String[] { "only-autoevaluation", "alien-evaluation"};
 	
 	private TextElement titleEl;
 	private RichTextElement summaryEl;
diff --git a/src/main/java/org/olat/modules/portfolio/ui/PageMetadataEditController.java b/src/main/java/org/olat/modules/portfolio/ui/PageMetadataEditController.java
index 18101014d8f..090ed298202 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/PageMetadataEditController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/PageMetadataEditController.java
@@ -35,6 +35,7 @@ import org.olat.core.gui.components.form.flexible.FormItemContainer;
 import org.olat.core.gui.components.form.flexible.elements.DownloadLink;
 import org.olat.core.gui.components.form.flexible.elements.FileElement;
 import org.olat.core.gui.components.form.flexible.elements.FormLink;
+import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement;
 import org.olat.core.gui.components.form.flexible.elements.RichTextElement;
 import org.olat.core.gui.components.form.flexible.elements.SingleSelection;
 import org.olat.core.gui.components.form.flexible.elements.TextBoxListElement;
@@ -87,16 +88,21 @@ public class PageMetadataEditController extends FormBasicController {
 	}
 	
 	private static final String[] alignKeys = new String[]{ PageImageAlign.background.name(), PageImageAlign.right.name(), PageImageAlign.right_large.name(), PageImageAlign.left.name(), PageImageAlign.left_large.name() };
+
+	private static final String[] onKeys = new String[] { "on" };
+	private static final String[] evaKeys = new String[] { "only-autoevaluation", "alien-evaluation"};
 	
 	private TextElement titleEl;
 	private RichTextElement summaryEl;
 	private SingleSelection bindersEl;
 	private SingleSelection sectionsEl;
+	private SingleSelection evaluationFormEl;
 	private SingleSelection assignmentsTemplatesEl;
 	private TextBoxListElement categoriesEl;
 	private DownloadLink downloadAssignmentDocEl;
 	private FileElement assignmentDocUploadEl;
 	private FormLayoutContainer assignmentDocsContainer;
+	private MultipleSelectionElement reviewerSeeAutoEvaEl;
 	
 	private FileElement imageUpload;
 	private SingleSelection imageAlignEl;
@@ -212,6 +218,9 @@ public class PageMetadataEditController extends FormBasicController {
 		titleEl.setElementCssClass("o_sel_pf_edit_entry_title");
 		titleEl.setEnabled(editTitleAndSummary);
 		titleEl.setMandatory(true);
+		if(!StringHelper.containsNonWhitespace(title)) {
+			titleEl.setFocus(true);
+		}
 		
 		String summary = page == null ? null : page.getSummary();
 		summaryEl = uifactory.addRichTextElementForStringDataMinimalistic("summary", "page.summary", summary, 8, 60, formLayout, getWindowControl());
@@ -261,6 +270,18 @@ public class PageMetadataEditController extends FormBasicController {
 		assignmentsTemplatesEl.addActionListener(FormEvent.ONCHANGE);
 		assignmentsTemplatesEl.setVisible(false);
 		
+		String[] evaValues = new String[]{
+				translate("assignment.evaluation.form.auto"),
+				translate("assignment.evaluation.form.auto.extern")
+			}; 
+		evaluationFormEl = uifactory.addRadiosVertical("assignment.evaluation.form", formLayout, evaKeys, evaValues);
+		evaluationFormEl.addActionListener(FormEvent.ONCHANGE);
+		evaluationFormEl.setVisible(false);
+		
+		String[] reviewerValues = new String[] { translate("assignment.evaluation.form.reviewer.see.auto") };
+		reviewerSeeAutoEvaEl = uifactory.addCheckboxesHorizontal("assignment.evaluation.form.reviewer.see.auto", null, formLayout, onKeys, reviewerValues);
+		reviewerSeeAutoEvaEl.setVisible(false);
+		
 		downloadAssignmentDocEl = uifactory.addDownloadLink("assignments.doc", "", "assignment.template.doc", null, formLayout);
 		downloadAssignmentDocEl.setVisible(false);
 		
@@ -405,6 +426,26 @@ public class PageMetadataEditController extends FormBasicController {
 	}
 	
 	private void updateForAssignmentTemplate(Assignment assignment) {
+		if(assignment != null && assignment.getAssignmentType() == AssignmentType.form) {
+			evaluationFormEl.setVisible(true);
+			if(assignment.isOnlyAutoEvaluation()) {
+				evaluationFormEl.select(evaKeys[0], true);
+			} else {
+				evaluationFormEl.select(evaKeys[1], true);
+			}
+			
+			boolean otherOptions = evaluationFormEl.isOneSelected() && evaluationFormEl.isSelected(1);
+			reviewerSeeAutoEvaEl.setVisible(otherOptions);
+			if(assignment.isReviewerSeeAutoEvaluation()) {
+				reviewerSeeAutoEvaEl.select(evaKeys[0], true);
+			} else {
+				reviewerSeeAutoEvaEl.uncheckAll();
+			}
+		} else {
+			evaluationFormEl.setVisible(false);
+			reviewerSeeAutoEvaEl.setVisible(false);
+		}
+		
 		if(assignment == null || assignment.getAssignmentType() != AssignmentType.document) {
 			downloadAssignmentDocEl.setVisible(false);
 			assignmentDocUploadEl.setVisible(false);
@@ -484,10 +525,19 @@ public class PageMetadataEditController extends FormBasicController {
 				align = PageImageAlign.valueOf(imageAlignEl.getSelectedKey());
 			}
 			
+			Boolean onlyAutoEvaluation = null;
+			Boolean reviewerCanSeeAutoEvaluation = null;
+			if(evaluationFormEl != null && evaluationFormEl.isVisible()) {
+				onlyAutoEvaluation = evaluationFormEl.isOneSelected() && evaluationFormEl.isSelected(0);
+				if(reviewerSeeAutoEvaEl.isVisible()) {
+					reviewerCanSeeAutoEvaluation = reviewerSeeAutoEvaEl.isAtLeastSelected(1);
+				}
+			}
 			if(assignmentsTemplatesEl != null && assignmentsTemplatesEl.isVisible() && assignmentsTemplatesEl.isOneSelected()
 					&& StringHelper.containsNonWhitespace(assignmentsTemplatesEl.getSelectedKey())) {
-				Assignment assignmentTemplate = this.assignmentTemplatesMap.get(assignmentsTemplatesEl.getSelectedKey());
-				page = portfolioService.startAssignmentFromTemplate(assignmentTemplate.getKey(), getIdentity(), title, summary, imagePath, align, selectSection);
+				Assignment assignmentTemplate = assignmentTemplatesMap.get(assignmentsTemplatesEl.getSelectedKey());
+				page = portfolioService.startAssignmentFromTemplate(assignmentTemplate.getKey(), getIdentity(), title, summary, imagePath, align,
+						selectSection, onlyAutoEvaluation, reviewerCanSeeAutoEvaluation);
 				saveDocuments(page, assignmentTemplate);
 			} else {
 				page = portfolioService.appendNewPage(getIdentity(), title, summary, imagePath, align, selectSection);
@@ -606,6 +656,9 @@ public class PageMetadataEditController extends FormBasicController {
 				processUpload();
 				updateDocumentsLayout();
 			}
+		} else if(evaluationFormEl == source) {
+			boolean otherOptions = evaluationFormEl.isOneSelected() && evaluationFormEl.isSelected(1);
+			reviewerSeeAutoEvaEl.setVisible(otherOptions);
 		} else if(source instanceof FormLink) {
 			FormLink link = (FormLink)source;
 			if("delete".equals(link.getCmd()) && link.getUserObject() instanceof File) {
diff --git a/src/test/java/org/olat/modules/portfolio/manager/AssignmentDAOTest.java b/src/test/java/org/olat/modules/portfolio/manager/AssignmentDAOTest.java
index eea7bb4b83e..8765b3a3eae 100644
--- a/src/test/java/org/olat/modules/portfolio/manager/AssignmentDAOTest.java
+++ b/src/test/java/org/olat/modules/portfolio/manager/AssignmentDAOTest.java
@@ -417,7 +417,7 @@ public class AssignmentDAOTest extends OlatTestCase {
 		// new page based on an assignment template
 		List<Section> sections = portfolioService.getSections(binder);
 		Page page = portfolioService.startAssignmentFromTemplate(template.getKey(), id,
-				"From template", "Froma template", null, null, sections.get(0));
+				"From template", "Froma template", null, null, sections.get(0), null, null);
 		dbInstance.commit();
 
 		// check the method
-- 
GitLab