Skip to content

Commit 3405cba

Browse files
authored
Merge branch 'master' into SAK-51198
2 parents abb5cc5 + 7950177 commit 3405cba

File tree

122 files changed

+1723
-1023
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

122 files changed

+1723
-1023
lines changed

Diff for: assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java

-1
Original file line numberDiff line numberDiff line change
@@ -4607,7 +4607,6 @@ public Map<String, String> transferCopyEntities(String fromContext, String toCon
46074607
AssignmentAllPurposeItem oAllPurposeItem = assignmentSupplementItemService.getAllPurposeItem(oAssignmentId);
46084608
if (oAllPurposeItem != null) {
46094609
AssignmentAllPurposeItem nAllPurposeItem = assignmentSupplementItemService.newAllPurposeItem();
4610-
assignmentSupplementItemService.saveAllPurposeItem(nAllPurposeItem);
46114610
nAllPurposeItem.setAssignmentId(nAssignment.getId());
46124611
nAllPurposeItem.setTitle(oAllPurposeItem.getTitle());
46134612
nAllPurposeItem.setText(oAllPurposeItem.getText());

Diff for: assignment/impl/src/test/org/sakaiproject/assignment/impl/AssignmentTestConfiguration.java

-8
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,6 @@
5656
import org.sakaiproject.rubrics.api.RubricsService;
5757
import org.sakaiproject.search.api.SearchIndexBuilder;
5858
import org.sakaiproject.search.api.SearchService;
59-
import org.sakaiproject.serialization.MapperFactory;
6059
import org.sakaiproject.site.api.SiteService;
6160
import org.sakaiproject.springframework.orm.hibernate.AdditionalHibernateMappings;
6261
import org.sakaiproject.tags.api.TagService;
@@ -342,11 +341,4 @@ public TagService tagService() {
342341
public LTIService ltiService() {
343342
return mock(LTIService.class);
344343
}
345-
346-
@Bean(name = "mapperFactory")
347-
public MapperFactory mapperFactory() {
348-
MapperFactory factory = new MapperFactory();
349-
factory.init();
350-
return factory;
351-
}
352344
}

Diff for: assignment/tool/src/java/org/sakaiproject/assignment/entityproviders/AssignmentEntityProvider.java

+12-18
Original file line numberDiff line numberDiff line change
@@ -809,25 +809,19 @@ private Map<String, Object> submissionToMap(Set<String> activeSubmitters, Assign
809809
for (PeerAssessmentItem review : reviews) {
810810
if (!review.getRemoved() && (review.getScore() != null || (StringUtils.isNotBlank(review.getComment())))) {
811811
//only show peer reviews that have either a score or a comment saved
812-
if (assignment.getPeerAssessmentAnonEval()) {
813-
//annonymous eval
814-
review.setAssessorDisplayName(rb.getFormattedMessage("gen.reviewer.countReview", completedReviews.size() + 1));
815-
} else {
816-
//need to set the assessor's display name
817-
try {
818-
if (assignment.getIsGroup()) {
819-
String siteId = toolManager.getCurrentPlacement().getContext();
820-
Site site = siteService.getSite(siteId);
821-
review.setAssessorDisplayName(site.getGroup(review.getId().getAssessorUserId()).getTitle());
822-
} else {
823-
review.setAssessorDisplayName(userDirectoryService.getUser(review.getId().getAssessorUserId()).getDisplayName());
824-
}
825-
} catch (IdUnusedException | UserNotDefinedException e) {
826-
//reviewer doesn't exist or one of userId/groupId/siteId is wrong
827-
log.warn("Either no site, or user: {}", e.toString());
828-
//set a default one:
829-
review.setAssessorDisplayName(rb.getFormattedMessage("gen.reviewer.countReview", completedReviews.size() + 1));
812+
try {
813+
if (assignment.getIsGroup()) {
814+
String siteId = assignment.getContext();
815+
Site site = siteService.getSite(siteId);
816+
review.setAssessorDisplayName(site.getGroup(review.getId().getAssessorUserId()).getTitle());
817+
} else {
818+
review.setAssessorDisplayName(userDirectoryService.getUser(review.getId().getAssessorUserId()).getDisplayName());
830819
}
820+
} catch (IdUnusedException | UserNotDefinedException e) {
821+
//reviewer doesn't exist or one of userId/groupId/siteId is wrong
822+
log.warn("Either no site, or user: {}", e.toString());
823+
//set a default one:
824+
review.setAssessorDisplayName(rb.getFormattedMessage("gen.reviewer.countReview", completedReviews.size() + 1));
831825
}
832826
// get attachments for peer review item
833827
List<PeerAssessmentAttachment> attachments = assignmentPeerAssessmentService.getPeerAssessmentAttachments(review.getId().getSubmissionId(), review.getId().getAssessorUserId());

Diff for: assignment/tool/src/java/org/sakaiproject/assignment/tool/AssignmentAction.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -10720,8 +10720,8 @@ public void doEdit_assignment(RunData data) {
1072010720
state.setAttribute(NEW_ASSIGNMENT_PEER_ASSESSMENT_NUM_REVIEWS, a.getPeerAssessmentNumberReviews());
1072110721
state.setAttribute(NEW_ASSIGNMENT_PEER_ASSESSMENT_INSTRUCTIONS, a.getPeerAssessmentInstructions());
1072210722
}
10723-
if (!(Boolean) serverConfigurationService.getBoolean("assignment.usePeerAssessment", true)) {
10724-
state.setAttribute(NEW_ASSIGNMENT_USE_PEER_ASSESSMENT, false);
10723+
if (!serverConfigurationService.getBoolean("assignment.usePeerAssessment", true)) {
10724+
state.setAttribute(NEW_ASSIGNMENT_USE_PEER_ASSESSMENT, Boolean.FALSE.toString());
1072510725
}
1072610726
// set whether we use the review service or not
1072710727
// TODO content review

Diff for: assignment/tool/src/webapp/vm/assignment/chef_assignments_instructor_list_submissions.vm

+1-1
Original file line numberDiff line numberDiff line change
@@ -459,7 +459,7 @@ function printView(url) {
459459
#end
460460

461461
#if ($gusers)
462-
<div class="badge text-bg-info fs-6">
462+
<div class="badge bg-primary fs-6">
463463
#foreach ($user in $gusers)
464464
#if($velocityCount > 1), #end
465465
#set($is_user_duplicate=false)

Diff for: assignment/tool/src/webapp/vm/assignment/chef_assignments_student_view_submission.vm

+1-1
Original file line numberDiff line numberDiff line change
@@ -555,7 +555,7 @@ $(document).ready(function(){
555555
</label>
556556
</td>
557557
<td headers="description" width="100%"> ##mozilla does not resize table children dynamically , so set here
558-
<span class="badge text-bg-info fs-6">
558+
<span class="badge bg-primary fs-6">
559559
#set($gusers = $!service.getSortedGroupUsers($group))
560560
#foreach ($user in $gusers)
561561
$formattedText.escapeHtml($user.getDisplayName())#if ($showUserId) ($formattedText.escapeHtml($user.getDisplayId())) #end

Diff for: common/archive-impl/impl2/src/java/org/sakaiproject/archive/impl/SiteMerger.java

+10-5
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@
5858
import org.sakaiproject.util.Xml;
5959
import org.sakaiproject.util.MergeConfig;
6060

61+
import org.sakaiproject.component.cover.ComponentManager;
62+
6163
@Slf4j
6264
@Setter
6365
public class SiteMerger {
@@ -289,13 +291,16 @@ private void processMerge(String filePath, String siteId, StringBuilder results,
289291
serviceName = translateServiceName(element.getTagName());
290292
}
291293

294+
EntityProducer service = (EntityProducer) org.sakaiproject.component.cover.ComponentManager.get(serviceName);
292295

293-
Collection<EntityProducer> entityProducers = entityManager.getEntityProducers();
294296
// find the service using the EntityManager
295-
EntityProducer service = entityProducers.stream()
296-
.filter(ep -> serviceName.equals(ep.getClass().getName()) || serviceName.equals(ep.getLabel()))
297-
.findFirst()
298-
.orElse(null);
297+
if ( service == null ) {
298+
Collection<EntityProducer> entityProducers = entityManager.getEntityProducers();
299+
service = entityProducers.stream()
300+
.filter(ep -> serviceName.equals(ep.getClass().getName()) || serviceName.equals(ep.getLabel()))
301+
.findFirst()
302+
.orElse(null);
303+
}
299304

300305
try {
301306
String msg = "";

Diff for: conversations/api/src/main/resources/conversations.properties

+1
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ restore=Restore
195195
restore_this_post=Restore this post. It will be visible to everybody once more.
196196
save=Save
197197
save_as_draft=Save as Draft
198+
search=Search
198199
search_field_tooltip=Search input field
199200
search_placeholder=Search
200201
settings=Settings

Diff for: conversations/impl/src/main/java/org/sakaiproject/conversations/impl/ConversationsServiceImpl.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -1888,7 +1888,7 @@ private TopicTransferBean decorateTopicBean(TopicTransferBean topicBean, Convers
18881888
topicBean.canPin = settings.getAllowPinning() && securityService.unlock(Permissions.TOPIC_PIN.label, siteRef);
18891889
topicBean.canBookmark = settings.getAllowBookmarking();
18901890
topicBean.canTag = securityService.unlock(Permissions.TOPIC_TAG.label, siteRef);
1891-
topicBean.canReact = !topicBean.isMine && settings.getAllowReactions();
1891+
topicBean.canReact = !topicBean.isMine && settings.getAllowReactions() && securityService.unlock(Permissions.POST_REACT.label, siteRef);
18921892
topicBean.canUpvote = !topicBean.isMine && settings.getAllowUpvoting() && !topicBean.hidden && securityService.unlock(Permissions.POST_UPVOTE.label, siteRef);
18931893
topicBean.canViewUpvotes = settings.getAllowUpvoting();
18941894
} else {
@@ -2697,6 +2697,7 @@ public String archive(String siteId, Document doc, Stack<Element> stack, String
26972697
topicEl.setAttribute("title", topic.getTitle());
26982698
topicEl.setAttribute("type", topic.getType().name());
26992699
topicEl.setAttribute("post-before-viewing", Boolean.toString(topic.getMustPostBeforeViewing()));
2700+
topicEl.setAttribute("anonymous", Boolean.toString(topic.getAnonymous()));
27002701
topicEl.setAttribute("allow-anonymous-posts", Boolean.toString(topic.getAllowAnonymousPosts()));
27012702
topicEl.setAttribute("pinned", Boolean.toString(topic.getPinned()));
27022703
topicEl.setAttribute("draft", Boolean.toString(topic.getDraft()));
@@ -2749,7 +2750,7 @@ public String merge(String toSiteId, Element root, String archivePath, String fr
27492750
topicBean.mustPostBeforeViewing = Boolean.parseBoolean(topicEl.getAttribute("post-before-viewing"));
27502751
topicBean.anonymous = Boolean.parseBoolean(topicEl.getAttribute("anonymous"));
27512752
topicBean.allowAnonymousPosts = Boolean.parseBoolean(topicEl.getAttribute("allow-anonymous-posts"));
2752-
topicBean.draft = Boolean.parseBoolean(topicEl.getAttribute("draft"));
2753+
topicBean.draft = true;
27532754
topicBean.pinned = Boolean.parseBoolean(topicEl.getAttribute("pinned"));
27542755
topicBean.visibility = topicEl.getAttribute("visibility");
27552756

Diff for: conversations/impl/src/test/org/sakaiproject/conversations/impl/ConversationsServiceTests.java

+3-1
Original file line numberDiff line numberDiff line change
@@ -2173,7 +2173,7 @@ public void merge() {
21732173
assertEquals(topic.getType().name(), topicEl.getAttribute("type"));
21742174
assertEquals(topic.getPinned(), Boolean.parseBoolean(topicEl.getAttribute("pinned")));
21752175
assertEquals(topic.getAnonymous(), Boolean.parseBoolean(topicEl.getAttribute("anonymous")));
2176-
assertEquals(topic.getDraft(), Boolean.parseBoolean(topicEl.getAttribute("draft")));
2176+
assertEquals(topic.getDraft(), true);
21772177
assertEquals(topic.getMustPostBeforeViewing(), Boolean.parseBoolean(topicEl.getAttribute("post-before-viewing")));
21782178

21792179
NodeList messageNodes = topicEl.getElementsByTagName("message");
@@ -2203,6 +2203,8 @@ public void merge() {
22032203

22042204
assertFalse(oldTitles.contains(extraTitle));
22052205
assertTrue(newTitles.contains(extraTitle));
2206+
2207+
topicRepository.findBySiteId(toSite).forEach(t -> assertEquals(t.getDraft(), true));
22062208
}
22072209

22082210
private TopicTransferBean saveTopic(TopicTransferBean topicBean) {

Diff for: entitybroker/api/src/java/org/sakaiproject/entitybroker/exception/EntityException.java

+16
Original file line numberDiff line numberDiff line change
@@ -94,4 +94,20 @@ public EntityException(String message, String entityReference, int responseCode)
9494
this.responseCode = responseCode;
9595
}
9696

97+
/**
98+
* Create an exception to indicate that this entity could not found,
99+
* this will trigger an HTTP error related to the responseCode if not caught before reaching the direct servlet
100+
*
101+
* @param message a message explaining the failure
102+
* @param entityReference the unique reference to an entity
103+
* @param responseCode the response code related to the failure that occurred,
104+
* should match with the SC constants in {@link HttpServletResponse}
105+
* @param cause the underlying cause of this exception
106+
*/
107+
public EntityException(String message, String entityReference, int responseCode, Throwable cause) {
108+
// Assuming EntityBrokerException has a constructor that takes (message, reference, cause)
109+
super(message, entityReference, cause);
110+
this.responseCode = responseCode;
111+
}
112+
97113
}

Diff for: entitybroker/core-providers/src/java/org/sakaiproject/entitybroker/providers/UserEntityProvider.java

+40-14
Original file line numberDiff line numberDiff line change
@@ -282,41 +282,66 @@ public Object getEntity(EntityReference ref) {
282282
public List<?> getEntities(EntityReference ref, Search search) {
283283
Collection<User> users = new ArrayList<User>();
284284

285-
// fix up the search limits
286-
if (search.getLimit() > 50 || search.getLimit() == 0) {
287-
search.setLimit(50);
285+
// Default and cap the limit
286+
long limit = search.getLimit();
287+
// Allow configuration of the maximum results per page, default 50
288+
int maxLimit = developerHelperService.getConfigurationSetting("entity.users.maxlimit", 50);
289+
if (limit <= 0 || limit > maxLimit) {
290+
limit = maxLimit;
288291
}
289-
if (search.getStart() == 0 || search.getStart() > 49) {
290-
search.setStart(1);
292+
293+
// Ensure start is at least 1 (assuming Search uses 1-based indexing)
294+
long start = search.getStart();
295+
if (start <= 0) {
296+
start = 1;
291297
}
292298

299+
// Calculate 'first' and 'last' for UDS methods (which seem to be 1-based index range)
300+
// NOTE: UDS methods expect int, potential overflow if start/limit are huge, though unlikely with maxLimit
301+
int first = (int) start;
302+
// Calculate the index of the last item needed
303+
int last = (int) (start + limit - 1);
304+
293305
// get the search restrictions out
294306
Restriction restrict = search.getRestrictionByProperty("email");
295307
if (restrict != null) {
296-
// search users by email
308+
// search users by email - This method doesn't support pagination directly.
309+
// Maintain original behavior: fetch all matching, pagination parameters are ignored.
310+
log.warn("Pagination (_start, _limit) is ignored when searching users by email via UserEntityProvider.getEntities");
297311
users = userDirectoryService.findUsersByEmail(restrict.value.toString());
298-
}
299-
if (restrict == null) {
312+
} else { // No email restriction, handle other searches or listing
300313
restrict = search.getRestrictionByProperty("eid");
301314
if (restrict == null) {
302315
restrict = search.getRestrictionByProperty("search");
303316
}
304317
if (restrict == null) {
305318
restrict = search.getRestrictionByProperty("criteria");
306319
}
320+
307321
if (restrict != null) {
308-
// search users but match
309-
users = userDirectoryService.searchUsers(restrict.value + "", (int) search.getStart(), (int) search.getLimit());
322+
// search users using the calculated first/last
323+
log.debug("Searching users with criteria '{}', first={}, last={}", restrict.value, first, last);
324+
users = userDirectoryService.searchUsers(restrict.value + "", first, last);
325+
} else {
326+
// No restriction, list users using the calculated first/last
327+
log.debug("Listing users with first={}, last={}", first, last);
328+
users = userDirectoryService.getUsers(first, last);
310329
}
311330
}
312-
if (restrict == null) {
313-
users = userDirectoryService.getUsers((int) search.getStart(), (int) search.getLimit());
314-
}
331+
315332
// convert these into EntityUser objects
316333
List<EntityUser> entityUsers = new ArrayList<>();
317334
boolean hasProfile = hasProfile();
335+
String currentRequestingUserId = developerHelperService.getCurrentUserId(); // Get once for logging efficiency
318336
for (User user : users) {
319-
entityUsers.add( convertUser(ref, user, hasProfile) );
337+
// Apply permission checks during conversion
338+
try {
339+
entityUsers.add(convertUser(ref, user, hasProfile));
340+
} catch (SecurityException e) {
341+
// Log users the current user cannot see, but continue processing others
342+
log.debug("User {} cannot view user {} due to SecurityException, skipping. Message: {}",
343+
currentRequestingUserId, user.getId(), e.getMessage());
344+
}
320345
}
321346
return entityUsers;
322347
}
@@ -685,3 +710,4 @@ private boolean userIdExplicitOnly() {
685710
}
686711

687712
}
713+

0 commit comments

Comments
 (0)