From 745cdb5fd6bd12867d37b27c3fdcda77d9aa3192 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Thu, 22 Aug 2019 21:20:49 +0200
Subject: [PATCH] OO-4197: allow business path to be null in your medias

---
 ...eAndEfficiencyStatementListController.java |  8 +++----
 ...ficateAndEfficiencyStatementListModel.java |  6 ++++--
 .../modules/portfolio/model/MediaImpl.java    |  2 +-
 .../portfolio/ui/MediaDetailsController.java  |  9 ++++----
 .../database/mysql/alter_14_0_x_to_14_1_0.sql |  2 ++
 .../database/mysql/setupDatabase.sql          |  2 +-
 .../oracle/alter_14_0_x_to_14_1_0.sql         |  3 +++
 .../database/oracle/setupDatabase.sql         |  2 +-
 .../postgresql/alter_14_0_x_to_14_1_0.sql     |  3 ++-
 .../database/postgresql/setupDatabase.sql     |  2 +-
 .../portfolio/manager/MediaDAOTest.java       | 21 +++++++++++++++++++
 11 files changed, 45 insertions(+), 15 deletions(-)

diff --git a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListController.java b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListController.java
index 632f15aa579..4379abf373f 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListController.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListController.java
@@ -208,9 +208,9 @@ public class CertificateAndEfficiencyStatementListController extends FormBasicCo
 		//artefact
 		if(assessedIdentity.equals(getIdentity())) {
 			if(portfolioV2Module.isEnabled()) {
-				tableColumnModel.addFlexiColumnModel(new DefaultFlexiColumnModel("table.header.artefact",
-						Cols.efficiencyStatement.ordinal(), CMD_MEDIA,
-						new StaticFlexiCellRenderer(CMD_MEDIA, new AsArtefactCellRenderer())));
+				DefaultFlexiColumnModel portfolioColumn = new DefaultFlexiColumnModel( Cols.artefact, CMD_MEDIA,
+						new BooleanCellRenderer(new StaticFlexiCellRenderer(CMD_MEDIA, new AsArtefactCellRenderer()), null));
+				tableColumnModel.addFlexiColumnModel(portfolioColumn);
 			} else {
 				EPArtefactHandler<?> artHandler = portfolioModule.getArtefactHandler(EfficiencyStatementArtefact.ARTEFACT_TYPE);
 				if(portfolioModule.isEnabled() && artHandler != null && artHandler.isEnabled() && assessedIdentity.equals(getIdentity())) {
@@ -399,7 +399,7 @@ public class CertificateAndEfficiencyStatementListController extends FormBasicCo
 		if(collectorCtrl != null) return;
 		
 		EfficiencyStatement fullStatement = esm.getUserEfficiencyStatementByKey(efficiencyStatementKey);
-		collectorCtrl = new CollectArtefactController(ureq, getWindowControl(), fullStatement, mediaHandler, "");
+		collectorCtrl = new CollectArtefactController(ureq, getWindowControl(), fullStatement, mediaHandler, null);
 		listenTo(collectorCtrl);
 		
 		cmc = new CloseableModalController(getWindowControl(), null, collectorCtrl.getInitialComponent(), true, title, true);
diff --git a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListModel.java b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListModel.java
index b523b164398..25d248a800c 100644
--- a/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListModel.java
+++ b/src/main/java/org/olat/course/certificate/ui/CertificateAndEfficiencyStatementListModel.java
@@ -85,7 +85,8 @@ public class CertificateAndEfficiencyStatementListModel extends DefaultFlexiTabl
 				return null;
 			}
 			case efficiencyStatement: return statement.getEfficiencyStatementKey();
-			case deleteEfficiencyStatement: return statement.getEfficiencyStatementKey() != null;
+			case deleteEfficiencyStatement:
+			case artefact: return statement.getEfficiencyStatementKey() != null;
 		}
 		return null;
 	}
@@ -100,7 +101,8 @@ public class CertificateAndEfficiencyStatementListModel extends DefaultFlexiTabl
 		efficiencyStatement("table.header.certificate", true),
 		certificate("table.header.certificate", true),
 		recertification("table.header.recertification", true),
-		deleteEfficiencyStatement("table.action.delete", false);
+		deleteEfficiencyStatement("table.action.delete", false),
+		artefact("table.header.artefact", false);
 		
 		private final String i18n;
 		private final boolean sortable;
diff --git a/src/main/java/org/olat/modules/portfolio/model/MediaImpl.java b/src/main/java/org/olat/modules/portfolio/model/MediaImpl.java
index 86b8ea90a67..49fd6aaa2ae 100644
--- a/src/main/java/org/olat/modules/portfolio/model/MediaImpl.java
+++ b/src/main/java/org/olat/modules/portfolio/model/MediaImpl.java
@@ -79,7 +79,7 @@ public class MediaImpl implements Persistable, CreateInfo, Media  {
 	private String content;
 	@Column(name="p_signature", nullable=false, insertable=true, updatable=true)
 	private int signature;
-	@Column(name="p_business_path", nullable=false, insertable=true, updatable=true)
+	@Column(name="p_business_path", nullable=true, insertable=true, updatable=true)
 	private String businessPath;
 	@Column(name="p_reference_id", nullable=true, insertable=true, updatable=true)
 	private String referenceId;
diff --git a/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java b/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
index 212c0aadcf4..925ac3ddf78 100644
--- a/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
+++ b/src/main/java/org/olat/modules/portfolio/ui/MediaDetailsController.java
@@ -73,7 +73,8 @@ import org.springframework.beans.factory.annotation.Autowired;
  */
 public class MediaDetailsController extends FormBasicController implements Activateable2, TooledController {
 
-	private Link editLink, deleteLink;
+	private Link editLink;
+	private Link deleteLink;
 	private Link gotoOriginalLink;
 	private final TooledStackedPanel stackPanel;
 
@@ -154,7 +155,7 @@ public class MediaDetailsController extends FormBasicController implements Activ
 				metaCont.contextPut("collectionDate", collectionDate);
 			}
 			
-			if (media.getBusinessPath() != null) {
+			if (StringHelper.containsNonWhitespace(media.getBusinessPath())) {
 				gotoOriginalLink = LinkFactory.createLink("goto.original", metaCont.getFormItemComponent(), this);
 			}
 			
@@ -164,9 +165,9 @@ public class MediaDetailsController extends FormBasicController implements Activ
 			}
 			
 			List<Category> categories = portfolioService.getCategories(media);
-			if(categories != null && categories.size() > 0) {
+			if(categories != null && !categories.isEmpty()) {
 				Map<String,String> categoriesMap = categories.stream()
-						.collect(Collectors.toMap(c -> c.getName(), c -> c.getName()));
+						.collect(Collectors.toMap(Category::getName, Category::getName));
 				TextBoxListElement categoriesEl = uifactory.addTextBoxListElement("categories", "categories", "categories.hint", categoriesMap, metaCont, getTranslator());
 				categoriesEl.setHelpText(translate("categories.hint"));
 				categoriesEl.setElementCssClass("o_sel_ep_tagsinput");
diff --git a/src/main/resources/database/mysql/alter_14_0_x_to_14_1_0.sql b/src/main/resources/database/mysql/alter_14_0_x_to_14_1_0.sql
index e28525c283e..cc7068f13c7 100644
--- a/src/main/resources/database/mysql/alter_14_0_x_to_14_1_0.sql
+++ b/src/main/resources/database/mysql/alter_14_0_x_to_14_1_0.sql
@@ -74,3 +74,5 @@ alter table o_lecture_block_audit_log add column fk_absence_notice bigint defaul
 -- curriculum
 update o_cur_curriculum set c_status='active' where c_status is null;
 
+-- portfolio
+alter table o_pf_media modify p_business_path varchar(255) default null;
diff --git a/src/main/resources/database/mysql/setupDatabase.sql b/src/main/resources/database/mysql/setupDatabase.sql
index 7b42b582f15..b336a3d42f2 100644
--- a/src/main/resources/database/mysql/setupDatabase.sql
+++ b/src/main/resources/database/mysql/setupDatabase.sql
@@ -1896,7 +1896,7 @@ create table o_pf_media (
    p_content mediumtext,
    p_signature bigint not null default 0,
    p_reference_id varchar(255) default null,
-   p_business_path varchar(255) not null,
+   p_business_path varchar(255) default null,
    p_creators varchar(1024) default null,
    p_place varchar(255) default null,
    p_publisher varchar(255) default null,
diff --git a/src/main/resources/database/oracle/alter_14_0_x_to_14_1_0.sql b/src/main/resources/database/oracle/alter_14_0_x_to_14_1_0.sql
index 377a470873b..ac81a9d7c64 100644
--- a/src/main/resources/database/oracle/alter_14_0_x_to_14_1_0.sql
+++ b/src/main/resources/database/oracle/alter_14_0_x_to_14_1_0.sql
@@ -77,3 +77,6 @@ alter table o_lecture_block_audit_log add fk_absence_notice number(20) default n
 
 -- curriculum
 update o_cur_curriculum set c_status='active' where c_status is null;
+
+-- portfolio
+alter table o_pf_media modify (p_business_path null);
diff --git a/src/main/resources/database/oracle/setupDatabase.sql b/src/main/resources/database/oracle/setupDatabase.sql
index 50ded488485..61951af4680 100644
--- a/src/main/resources/database/oracle/setupDatabase.sql
+++ b/src/main/resources/database/oracle/setupDatabase.sql
@@ -1815,7 +1815,7 @@ create table o_pf_media (
    p_content CLOB,
    p_signature number(20) default 0 not null,
    p_reference_id varchar2(255 char) default null,
-   p_business_path varchar2(255 char) not null,
+   p_business_path varchar2(255 char) default null,
    p_creators varchar2(1024 char) default null,
    p_place varchar2(255 char) default null,
    p_publisher varchar2(255 char) default null,
diff --git a/src/main/resources/database/postgresql/alter_14_0_x_to_14_1_0.sql b/src/main/resources/database/postgresql/alter_14_0_x_to_14_1_0.sql
index 4807801ab02..00b610c62f6 100644
--- a/src/main/resources/database/postgresql/alter_14_0_x_to_14_1_0.sql
+++ b/src/main/resources/database/postgresql/alter_14_0_x_to_14_1_0.sql
@@ -77,5 +77,6 @@ alter table o_lecture_block_audit_log add column fk_absence_notice int8 default
 -- curriculum
 update o_cur_curriculum set c_status='active' where c_status is null;
 
-
+-- portfolio
+alter table o_pf_media alter column p_business_path drop not null;
 
diff --git a/src/main/resources/database/postgresql/setupDatabase.sql b/src/main/resources/database/postgresql/setupDatabase.sql
index 0a3137138a9..ffd419096d0 100644
--- a/src/main/resources/database/postgresql/setupDatabase.sql
+++ b/src/main/resources/database/postgresql/setupDatabase.sql
@@ -1804,7 +1804,7 @@ create table o_pf_media (
    p_content text,
    p_signature int8 not null default 0,
    p_reference_id varchar(255) default null,
-   p_business_path varchar(255) not null,
+   p_business_path varchar(255) default null,
    p_creators varchar(1024) default null,
    p_place varchar(255) default null,
    p_publisher varchar(255) default null,
diff --git a/src/test/java/org/olat/modules/portfolio/manager/MediaDAOTest.java b/src/test/java/org/olat/modules/portfolio/manager/MediaDAOTest.java
index a9f27630357..2528d5975fe 100644
--- a/src/test/java/org/olat/modules/portfolio/manager/MediaDAOTest.java
+++ b/src/test/java/org/olat/modules/portfolio/manager/MediaDAOTest.java
@@ -80,6 +80,27 @@ public class MediaDAOTest extends OlatTestCase {
 		Assert.assertEquals(id, reloadedMedia.getAuthor());
 	}
 	
+	@Test
+	public void createMedia_withoutBusinessPath() {
+		Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("pf-media-1null");
+		Media media = mediaDao.createMedia("Media", null, null, "Forum", null, null, 10, id);
+		dbInstance.commit();
+		
+		Assert.assertNotNull(media);
+		Assert.assertNotNull(media.getKey());
+		Assert.assertNotNull(media.getCreationDate());
+		Assert.assertNotNull(media.getCollectionDate());
+		Assert.assertEquals(id, media.getAuthor());
+		
+		Media reloadedMedia = mediaDao.loadByKey(media.getKey());
+		Assert.assertNotNull(reloadedMedia);
+		Assert.assertEquals(media, reloadedMedia);
+		Assert.assertEquals(id, reloadedMedia.getAuthor());
+		Assert.assertEquals("Media", reloadedMedia.getTitle());
+		Assert.assertNull(reloadedMedia.getBusinessPath());
+		Assert.assertEquals(id, reloadedMedia.getAuthor());
+	}
+	
 	@Test
 	public void searchByAuthor() {
 		Identity author = JunitTestHelper.createAndPersistIdentityAsRndUser("pf-media-2");
-- 
GitLab