Skip to content
Snippets Groups Projects
Commit 5ae0aad9 authored by srosse's avatar srosse
Browse files

Merge remote-tracking branch 'origin/OpenOLAT_14.2'

parents 705f259f 47769f4e
No related branches found
No related tags found
No related merge requests found
Showing
with 138 additions and 6 deletions
...@@ -19,6 +19,8 @@ ...@@ -19,6 +19,8 @@
*/ */
package org.olat.modules.adobeconnect.manager; package org.olat.modules.adobeconnect.manager;
import static org.olat.modules.adobeconnect.manager.AdobeConnectUtils.orDefault;
import java.net.URI; import java.net.URI;
import java.util.List; import java.util.List;
...@@ -88,8 +90,8 @@ public class AdobeConnect9Provider extends AbstractAdobeConnectProvider { ...@@ -88,8 +90,8 @@ public class AdobeConnect9Provider extends AbstractAdobeConnectProvider {
UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder(); UriBuilder builder = adobeConnectModule.getAdobeConnectUriBuilder();
builder builder
.queryParam("action", "principal-update") .queryParam("action", "principal-update")
.queryParam("first-name", identity.getUser().getFirstName()) .queryParam("first-name", orDefault(identity.getUser().getFirstName(), "John"))
.queryParam("last-name", identity.getUser().getLastName()); .queryParam("last-name", orDefault(identity.getUser().getLastName(), "Doe"));
if(!adobeConnectModule.isLoginCompatibilityMode()) { if(!adobeConnectModule.isLoginCompatibilityMode()) {
builder builder
.queryParam("email", identity.getUser().getEmail()); .queryParam("email", identity.getUser().getEmail());
......
...@@ -220,6 +220,10 @@ public class AdobeConnectUtils { ...@@ -220,6 +220,10 @@ public class AdobeConnectUtils {
} }
} }
protected static String orDefault(String val, String defaultValue) {
return StringHelper.containsNonWhitespace(val) ? val : defaultValue;
}
protected static void print(Document document) { protected static void print(Document document) {
if(log.isDebugEnabled()) { if(log.isDebugEnabled()) {
try(StringWriter writer = new StringWriter()) { try(StringWriter writer = new StringWriter()) {
......
...@@ -19,6 +19,9 @@ ...@@ -19,6 +19,9 @@
*/ */
package org.olat.modules.adobeconnect.manager; package org.olat.modules.adobeconnect.manager;
import static org.olat.modules.adobeconnect.manager.AdobeConnectUtils.orDefault;
import java.util.List; import java.util.List;
import javax.ws.rs.core.UriBuilder; import javax.ws.rs.core.UriBuilder;
...@@ -39,7 +42,6 @@ import org.olat.modules.adobeconnect.model.AdobeConnectPrincipal; ...@@ -39,7 +42,6 @@ import org.olat.modules.adobeconnect.model.AdobeConnectPrincipal;
import org.olat.modules.adobeconnect.model.AdobeConnectSco; import org.olat.modules.adobeconnect.model.AdobeConnectSco;
import org.olat.modules.adobeconnect.model.BreezeSession; import org.olat.modules.adobeconnect.model.BreezeSession;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
/** /**
* *
* Initial date: 17 avr. 2019<br> * Initial date: 17 avr. 2019<br>
...@@ -92,8 +94,8 @@ public class DFNprovider extends AbstractAdobeConnectProvider { ...@@ -92,8 +94,8 @@ public class DFNprovider extends AbstractAdobeConnectProvider {
builder builder
.queryParam("action", "lms-user-create") .queryParam("action", "lms-user-create")
.queryParam("login", identity.getUser().getEmail()) .queryParam("login", identity.getUser().getEmail())
.queryParam("first-name", identity.getUser().getFirstName()) .queryParam("first-name", orDefault(identity.getUser().getFirstName(), "John"))
.queryParam("last-name", identity.getUser().getLastName()); .queryParam("last-name", orDefault(identity.getUser().getLastName(), "Doe"));
HttpGet get = createAdminMethod(builder, errors); HttpGet get = createAdminMethod(builder, errors);
List<AdobeConnectPrincipal> users = null; List<AdobeConnectPrincipal> users = null;
......
...@@ -300,6 +300,19 @@ public class QItemQueriesDAO { ...@@ -300,6 +300,19 @@ public class QItemQueriesDAO {
sb.and(); sb.and();
PersistenceHelper.appendFuzzyLike(sb, "item.topic", "topic", dbInstance.getDbVendor()); PersistenceHelper.appendFuzzyLike(sb, "item.topic", "topic", dbInstance.getDbVendor());
} }
if(StringHelper.containsNonWhitespace(params.getOwner())) {
sb.and()
.append(" exists (select mship.key from ").append(SecurityGroupMembershipImpl.class.getName()).append(" as mship ")
.append(" inner join mship.identity as oIdent")
.append(" inner join oIdent.user as oUser")
.append(" where mship.securityGroup.key=item.ownerGroup.key and (");
PersistenceHelper.appendFuzzyLike(sb, "oUser.firstName", "owner", dbInstance.getDbVendor());
sb.append(" or ");
PersistenceHelper.appendFuzzyLike(sb, "oUser.lastName", "owner", dbInstance.getDbVendor());
sb.append(" or ");
PersistenceHelper.appendFuzzyLike(sb, "oIdent.name", "owner", dbInstance.getDbVendor());
sb.append(" ))");
}
if(StringHelper.containsNonWhitespace(params.getKeywords())) { if(StringHelper.containsNonWhitespace(params.getKeywords())) {
sb.and(); sb.and();
PersistenceHelper.appendFuzzyLike(sb, "item.keywords", "keywords", dbInstance.getDbVendor()); PersistenceHelper.appendFuzzyLike(sb, "item.keywords", "keywords", dbInstance.getDbVendor());
...@@ -427,6 +440,10 @@ public class QItemQueriesDAO { ...@@ -427,6 +440,10 @@ public class QItemQueriesDAO {
String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getTopic()); String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getTopic());
query.setParameter("topic", fuzzySearch); query.setParameter("topic", fuzzySearch);
} }
if(StringHelper.containsNonWhitespace(params.getOwner())) {
String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getOwner());
query.setParameter("owner", fuzzySearch);
}
if(StringHelper.containsNonWhitespace(params.getKeywords())) { if(StringHelper.containsNonWhitespace(params.getKeywords())) {
String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getKeywords()); String fuzzySearch = PersistenceHelper.makeFuzzyQueryString(params.getKeywords());
query.setParameter("keywords", fuzzySearch); query.setParameter("keywords", fuzzySearch);
......
...@@ -29,6 +29,7 @@ import javax.persistence.EntityManager; ...@@ -29,6 +29,7 @@ import javax.persistence.EntityManager;
import javax.persistence.LockModeType; import javax.persistence.LockModeType;
import javax.persistence.TypedQuery; import javax.persistence.TypedQuery;
import org.apache.logging.log4j.Logger;
import org.olat.basesecurity.GroupRoles; import org.olat.basesecurity.GroupRoles;
import org.olat.basesecurity.SecurityGroup; import org.olat.basesecurity.SecurityGroup;
import org.olat.basesecurity.SecurityGroupMembershipImpl; import org.olat.basesecurity.SecurityGroupMembershipImpl;
...@@ -36,6 +37,7 @@ import org.olat.basesecurity.manager.SecurityGroupDAO; ...@@ -36,6 +37,7 @@ import org.olat.basesecurity.manager.SecurityGroupDAO;
import org.olat.core.commons.persistence.DB; import org.olat.core.commons.persistence.DB;
import org.olat.core.commons.services.mark.impl.MarkImpl; import org.olat.core.commons.services.mark.impl.MarkImpl;
import org.olat.core.id.Identity; import org.olat.core.id.Identity;
import org.olat.core.logging.Tracing;
import org.olat.group.BusinessGroup; import org.olat.group.BusinessGroup;
import org.olat.modules.qpool.QuestionItem; import org.olat.modules.qpool.QuestionItem;
import org.olat.modules.qpool.QuestionItem2Resource; import org.olat.modules.qpool.QuestionItem2Resource;
...@@ -60,6 +62,8 @@ import org.springframework.stereotype.Service; ...@@ -60,6 +62,8 @@ import org.springframework.stereotype.Service;
@Service("questionDao") @Service("questionDao")
public class QuestionItemDAO { public class QuestionItemDAO {
private static final Logger log = Tracing.createLoggerFor(QuestionItemDAO.class);
@Autowired @Autowired
private DB dbInstance; private DB dbInstance;
@Autowired @Autowired
...@@ -177,6 +181,8 @@ public class QuestionItemDAO { ...@@ -177,6 +181,8 @@ public class QuestionItemDAO {
for(Identity author:authors) { for(Identity author:authors) {
if(!securityGroupDao.isIdentityInSecurityGroup(author, secGroup)) { if(!securityGroupDao.isIdentityInSecurityGroup(author, secGroup)) {
securityGroupDao.addIdentityToSecurityGroup(author, secGroup); securityGroupDao.addIdentityToSecurityGroup(author, secGroup);
log.info(Tracing.M_AUDIT, "Added owner identity '{}' to item with key {} ({}, {})",
author.getKey(), item.getKey(), item.getTitle(), item.getTopic());
} }
} }
dbInstance.commit(); dbInstance.commit();
...@@ -190,6 +196,8 @@ public class QuestionItemDAO { ...@@ -190,6 +196,8 @@ public class QuestionItemDAO {
for(Identity author:authors) { for(Identity author:authors) {
if(securityGroupDao.isIdentityInSecurityGroup(author, secGroup)) { if(securityGroupDao.isIdentityInSecurityGroup(author, secGroup)) {
securityGroupDao.removeIdentityFromSecurityGroup(author, secGroup); securityGroupDao.removeIdentityFromSecurityGroup(author, secGroup);
log.info(Tracing.M_AUDIT, "Removed owner identity '{}' from item with key {} ({}, {})",
author.getKey(), item.getKey(), item.getTitle(), item.getTopic());
} }
} }
dbInstance.commit(); dbInstance.commit();
...@@ -261,6 +269,7 @@ public class QuestionItemDAO { ...@@ -261,6 +269,7 @@ public class QuestionItemDAO {
for(QuestionItemShort item:items) { for(QuestionItemShort item:items) {
QuestionItem refItem = loadLazyReferenceId(item.getKey()); QuestionItem refItem = loadLazyReferenceId(item.getKey());
if(refItem != null) { if(refItem != null) {
log.info(Tracing.M_AUDIT, "Delete question item {} ({}, {})", item.getKey(), item.getTitle(), item.getTopic());
em.remove(refItem); em.remove(refItem);
} }
} }
......
...@@ -48,6 +48,7 @@ public class SearchQuestionItemParams implements Cloneable { ...@@ -48,6 +48,7 @@ public class SearchQuestionItemParams implements Cloneable {
private Identity author; private Identity author;
private String title; private String title;
private String topic; private String topic;
private String owner;
private String keywords; private String keywords;
private String coverage; private String coverage;
private String informations; private String informations;
...@@ -146,6 +147,14 @@ public class SearchQuestionItemParams implements Cloneable { ...@@ -146,6 +147,14 @@ public class SearchQuestionItemParams implements Cloneable {
this.topic = topic; this.topic = topic;
} }
public String getOwner() {
return owner;
}
public void setOwner(String owner) {
this.owner = owner;
}
public String getKeywords() { public String getKeywords() {
return keywords; return keywords;
} }
...@@ -345,6 +354,9 @@ public class SearchQuestionItemParams implements Cloneable { ...@@ -345,6 +354,9 @@ public class SearchQuestionItemParams implements Cloneable {
if(StringHelper.containsNonWhitespace(searchString)) { if(StringHelper.containsNonWhitespace(searchString)) {
clone.searchString = searchString; clone.searchString = searchString;
} }
if(StringHelper.containsNonWhitespace(owner)) {
clone.owner = owner;
}
if(favoritOnly) { if(favoritOnly) {
clone.favoritOnly = favoritOnly; clone.favoritOnly = favoritOnly;
} }
......
...@@ -201,6 +201,7 @@ my.share=Meine Shares ...@@ -201,6 +201,7 @@ my.share=Meine Shares
new.item=Frage erstellen new.item=Frage erstellen
next=N\u00E4chste next=N\u00E4chste
numberOfRatings=Anzahl Bewertungen numberOfRatings=Anzahl Bewertungen
owner=Autor
pool.add.to.source=Fragen zum Pool "{0}" hinzuf\u00FCgen pool.add.to.source=Fragen zum Pool "{0}" hinzuf\u00FCgen
pool.key=ID pool.key=ID
pool.name=Name pool.name=Name
......
...@@ -201,6 +201,7 @@ my.share=My shares ...@@ -201,6 +201,7 @@ my.share=My shares
new.item=Create question new.item=Create question
next=Next next=Next
numberOfRatings=Number of ratings numberOfRatings=Number of ratings
owner=Author
pool.add.to.source=Add questions to pool "{0}" pool.add.to.source=Add questions to pool "{0}"
pool.key=ID pool.key=ID
pool.name=Name pool.name=Name
......
...@@ -334,6 +334,7 @@ public class ExtendedSearchController extends FormBasicController implements Ext ...@@ -334,6 +334,7 @@ public class ExtendedSearchController extends FormBasicController implements Ext
attributes.add(new SearchAttribute("classification.taxonomy.level", new TaxonomicFieldQueryParameter())); attributes.add(new SearchAttribute("classification.taxonomy.level", new TaxonomicFieldQueryParameter()));
attributes.add(new SearchAttribute("classification.taxonomic.path.incl", new TaxonomicPathQueryParameter())); attributes.add(new SearchAttribute("classification.taxonomic.path.incl", new TaxonomicPathQueryParameter()));
} }
attributes.add(new SearchAttribute("owner", new StringQueryParameter(AbstractOlatDocument.AUTHOR_FIELD_NAME)));
//educational //educational
if (qPoolSecurityCallback.canUseEducationalContext()) { if (qPoolSecurityCallback.canUseEducationalContext()) {
attributes.add(new SearchAttribute("educational.context", new ContextQueryParameter())); attributes.add(new SearchAttribute("educational.context", new ContextQueryParameter()));
...@@ -400,6 +401,8 @@ public class ExtendedSearchController extends FormBasicController implements Ext ...@@ -400,6 +401,8 @@ public class ExtendedSearchController extends FormBasicController implements Ext
searchParams.setTopic(val); searchParams.setTopic(val);
} else if(QItemDocument.KEYWORDS_FIELD.equals(docAttribute)) { } else if(QItemDocument.KEYWORDS_FIELD.equals(docAttribute)) {
searchParams.setKeywords(val); searchParams.setKeywords(val);
} else if(AbstractOlatDocument.AUTHOR_FIELD_NAME.equals(docAttribute)) {
searchParams.setOwner(val);
} else if(QItemDocument.COVERAGE_FIELD.equals(docAttribute)) { } else if(QItemDocument.COVERAGE_FIELD.equals(docAttribute)) {
searchParams.setCoverage(val); searchParams.setCoverage(val);
} else if(QItemDocument.ADD_INFOS_FIELD.equals(docAttribute)) { } else if(QItemDocument.ADD_INFOS_FIELD.equals(docAttribute)) {
...@@ -461,7 +464,7 @@ public class ExtendedSearchController extends FormBasicController implements Ext ...@@ -461,7 +464,7 @@ public class ExtendedSearchController extends FormBasicController implements Ext
private final LicenseSelectionConfig config; private final LicenseSelectionConfig config;
public LicenseQueryParameter() { public LicenseQueryParameter() {
super(QItemDocument.LICENSE_TYPE_FIELD_NAME); super(AbstractOlatDocument.LICENSE_TYPE_FIELD_NAME);
config = LicenseUIFactory.createLicenseSelectionConfig(licenseHandler); config = LicenseUIFactory.createLicenseSelectionConfig(licenseHandler);
} }
......
/**
* <a href="http://www.openolat.org">
* OpenOLAT - Online Learning and Training</a><br>
* <p>
* Licensed under the Apache License, Version 2.0 (the "License"); <br>
* you may not use this file except in compliance with the License.<br>
* You may obtain a copy of the License at the
* <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache homepage</a>
* <p>
* Unless required by applicable law or agreed to in writing,<br>
* software distributed under the License is distributed on an "AS IS" BASIS, <br>
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. <br>
* See the License for the specific language governing permissions and <br>
* limitations under the License.
* <p>
* Initial code contributed and copyrighted by<br>
* frentix GmbH, http://www.frentix.com
* <p>
*/
package org.olat.modules.adobeconnect.manager;
import org.junit.Assert;
import org.junit.Test;
/**
*
* Initial date: 12 mars 2020<br>
* @author srosse, stephane.rosse@frentix.com, http://www.frentix.com
*
*/
public class AdobeConnectUtilsTest {
@Test
public void orDefault() {
String val = AdobeConnectUtils.orDefault("my-value", "a-default-value");
Assert.assertEquals("my-value", val);
}
@Test
public void orDefault_default() {
String val = AdobeConnectUtils.orDefault(null, "a-default-value");
Assert.assertEquals("a-default-value", val);
}
}
...@@ -327,6 +327,41 @@ public class QItemQueriesDAOTest extends OlatTestCase { ...@@ -327,6 +327,41 @@ public class QItemQueriesDAOTest extends OlatTestCase {
} }
} }
@Test
public void getItemsByOwner() {
//create an author with 2 items
Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("QOwner-and-only-2-");
QuestionItem item = questionDao.createAndPersist(id, "NGC 7837", QTIConstants.QTI_12_FORMAT, Locale.ENGLISH.getLanguage(), null, null, null, qItemType);
dbInstance.commitAndCloseSession();
SearchQuestionItemParams params = new SearchQuestionItemParams(id, null, Locale.ENGLISH);
params.setOwner("Owner-and-only");
SortKey sortAsc = new SortKey(QuestionItemView.OrderBy.title.name(), true);
List<QuestionItemView> views = qItemQueriesDao.getItems(params, 0, -1, sortAsc);
Assert.assertNotNull(views);
Assert.assertFalse(views.isEmpty());
boolean match = views.stream().anyMatch(view -> item.getKey().equals(view.getKey()));
Assert.assertTrue(match);
}
@Test
public void getItemsByOwner_negativeTest() {
//create an author with 2 items
Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("QOwn-29-");
QuestionItem item = questionDao.createAndPersist(id, "NGC 7838", QTIConstants.QTI_12_FORMAT, Locale.ENGLISH.getLanguage(), null, null, null, qItemType);
dbInstance.commitAndCloseSession();
Assert.assertNotNull(item);
SearchQuestionItemParams params = new SearchQuestionItemParams(id, null, Locale.ENGLISH);
params.setOwner(UUID.randomUUID().toString());
SortKey sortAsc = new SortKey(QuestionItemView.OrderBy.title.name(), true);
List<QuestionItemView> views = qItemQueriesDao.getItems(params, 0, -1, sortAsc);
Assert.assertNotNull(views);
Assert.assertTrue(views.isEmpty());
}
@Test @Test
public void getItemsOfPool() { public void getItemsOfPool() {
Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("Poolman-"); Identity id = JunitTestHelper.createAndPersistIdentityAsRndUser("Poolman-");
......
...@@ -204,6 +204,7 @@ import org.junit.runners.Suite; ...@@ -204,6 +204,7 @@ import org.junit.runners.Suite;
org.olat.modules.adobeconnect.manager.AdobeConnectProviderTest.class, org.olat.modules.adobeconnect.manager.AdobeConnectProviderTest.class,
org.olat.modules.adobeconnect.manager.AdobeConnectUserDAOTest.class, org.olat.modules.adobeconnect.manager.AdobeConnectUserDAOTest.class,
org.olat.modules.adobeconnect.manager.AdobeConnectMeetingDAOTest.class, org.olat.modules.adobeconnect.manager.AdobeConnectMeetingDAOTest.class,
org.olat.modules.adobeconnect.manager.AdobeConnectUtilsTest.class,
org.olat.modules.iq.IQManagerTest.class, org.olat.modules.iq.IQManagerTest.class,
org.olat.modules.fo.ForumManagerTest.class,//fail org.olat.modules.fo.ForumManagerTest.class,//fail
org.olat.modules.wiki.WikiUnitTest.class, org.olat.modules.wiki.WikiUnitTest.class,
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment