Skip to content

Commit 2be7718

Browse files
Fernando Alvarez-Castellanos Rojoern
Fernando Alvarez-Castellanos Rojo
andauthored
SAK-46685 Assignment move TimeSheet to be it's own independent service (sakaiproject#10096)
* SAK-46685 Getting TimeSheet independent of assignment * Minor changes and unit tests * Update kernel/api/src/main/java/org/sakaiproject/timesheet/api/TimeSheetEntry.java Co-authored-by: Earle Nietzel <[email protected]> * Changing TimeSheetEntry index and format changes Co-authored-by: Earle Nietzel <[email protected]>
1 parent 1b0a09a commit 2be7718

File tree

22 files changed

+502
-304
lines changed

22 files changed

+502
-304
lines changed

assignment/api/src/java/org/sakaiproject/assignment/api/AssignmentService.java

+14-6
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import org.sakaiproject.assignment.api.model.AssignmentSubmission;
3434
import org.sakaiproject.assignment.api.model.AssignmentSubmissionSubmitter;
3535
import org.sakaiproject.content.api.ContentResource;
36-
import org.sakaiproject.assignment.api.model.TimeSheetEntry;
3736
import org.sakaiproject.entity.api.Entity;
3837
import org.sakaiproject.entity.api.EntityProducer;
3938
import org.sakaiproject.entity.api.Reference;
@@ -43,6 +42,7 @@
4342
import org.sakaiproject.exception.PermissionException;
4443
import org.sakaiproject.site.api.Group;
4544
import org.sakaiproject.site.api.Site;
45+
import org.sakaiproject.timesheet.api.TimeSheetEntry;
4646
import org.sakaiproject.user.api.User;
4747

4848
/**
@@ -759,8 +759,6 @@ public String getDeepLinkWithPermissions(String context, String assignmentId, bo
759759
*/
760760
public void postReviewableSubmissionAttachments(AssignmentSubmission submission);
761761

762-
boolean isTimeSheetEnabled(String siteId);
763-
764762
/**
765763
* This will return the internationalized title of the tool.
766764
* This is used when creating a new gradebook item.
@@ -823,11 +821,11 @@ public String getDeepLinkWithPermissions(String context, String assignmentId, bo
823821
*/
824822
public List<MultiGroupRecord> checkSubmissionForUsersInMultipleGroups(String siteId, Group submissionGroup, Collection<Group> asnGroups);
825823

826-
public boolean isValidTimesheetTime(String timeSheet);
824+
public boolean isValidTimeSheetTime(String timeSheet);
827825

828-
public TimeSheetEntry getTimeSheetEntry(Long timeSheetId) throws PermissionException;
826+
public List<TimeSheetEntry> getTimeSheetEntries(AssignmentSubmissionSubmitter submissionSubmitter);
829827

830-
public void newTimeSheetEntry(AssignmentSubmissionSubmitter submissionSubmitter, TimeSheetEntry timeSheet) throws PermissionException;
828+
public void saveTimeSheetEntry(AssignmentSubmissionSubmitter submissionSubmitter, TimeSheetEntry timeSheet) throws PermissionException;
831829

832830
public void deleteTimeSheetEntry(Long timeSheetId) throws PermissionException;
833831

@@ -843,4 +841,14 @@ public String getDeepLinkWithPermissions(String context, String assignmentId, bo
843841
* @return
844842
*/
845843
public String createContentReviewAssignment(Assignment a, String assignmentRef, Instant openTime, Instant dueTime, Instant closeTime);
844+
845+
public String getTotalTimeSheet(AssignmentSubmissionSubmitter asnSubmissionSubmiter);
846+
847+
public boolean existsTimeSheetEntries(AssignmentSubmissionSubmitter asnSubmissionSubmitter);
848+
849+
public Integer timeToInt(String time);
850+
851+
public String intToTime(int time);
852+
853+
public boolean isTimeSheetEnabled(String siteId);
846854
}

assignment/api/src/java/org/sakaiproject/assignment/api/model/AssignmentSubmissionSubmitter.java

-14
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,6 @@
3737
import lombok.NoArgsConstructor;
3838
import lombok.ToString;
3939

40-
import java.util.HashSet;
41-
import java.util.Set;
42-
43-
import javax.persistence.CascadeType;
44-
import javax.persistence.OneToMany;
45-
import javax.persistence.OrderBy;
46-
47-
import com.fasterxml.jackson.annotation.JsonManagedReference;
48-
4940
/**
5041
* Defines a relation between a submission and the submission's submitters.
5142
* <br/> - A submitter can have its own grade separate from the grade of the submission,
@@ -98,9 +89,4 @@ public class AssignmentSubmissionSubmitter {
9889
@Column(name = "TIME_SPENT", length = 255)
9990
private String timeSpent;
10091

101-
@OneToMany(mappedBy = "assignmentSubmissionSubmitter", cascade = CascadeType.ALL, orphanRemoval = true)
102-
@OrderBy("startTime ASC")
103-
@JsonManagedReference
104-
private Set<TimeSheetEntry> timeSheetEntries = new HashSet<>();
105-
10692
}

assignment/api/src/java/org/sakaiproject/assignment/api/model/TimeSheetEntry.java

-84
This file was deleted.

assignment/api/src/java/org/sakaiproject/assignment/api/persistence/AssignmentRepository.java

-9
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,6 @@
2424
import org.sakaiproject.assignment.api.model.Assignment;
2525
import org.sakaiproject.assignment.api.model.AssignmentSubmission;
2626
import org.sakaiproject.assignment.api.model.AssignmentSubmissionSubmitter;
27-
import org.sakaiproject.assignment.api.model.TimeSheetEntry;
2827
import org.sakaiproject.serialization.SerializableRepository;
2928

3029
/**
@@ -95,12 +94,4 @@ AssignmentSubmission newSubmission(String assignmentId,
9594

9695
Collection<String> findGroupsForAssignmentById(String assignmentId);
9796

98-
void newTimeSheetEntry(AssignmentSubmissionSubmitter submissionSubmitter, TimeSheetEntry timeSheetEntry);
99-
100-
boolean existsTimeSheetEntry(Long timeSheetId);
101-
102-
TimeSheetEntry findTimeSheetEntry(Long timeSheetId);
103-
104-
void deleteTimeSheetEntry(Long timeSheetId);
105-
10697
}

assignment/impl/src/java/org/sakaiproject/assignment/impl/AssignmentServiceImpl.java

+62-42
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,6 @@
9191
import org.sakaiproject.assignment.api.model.AssignmentSubmissionSubmitter;
9292
import org.sakaiproject.assignment.api.model.AssignmentSupplementItemAttachment;
9393
import org.sakaiproject.assignment.api.model.AssignmentSupplementItemService;
94-
import org.sakaiproject.assignment.api.model.TimeSheetEntry;
9594
import org.sakaiproject.assignment.api.persistence.AssignmentRepository;
9695
import org.sakaiproject.assignment.api.reminder.AssignmentDueReminderService;
9796
import org.sakaiproject.assignment.api.taggable.AssignmentActivityProducer;
@@ -167,6 +166,8 @@
167166
import org.sakaiproject.tasks.api.TaskService;
168167
import org.sakaiproject.time.api.TimeService;
169168
import org.sakaiproject.time.api.UserTimeService;
169+
import org.sakaiproject.timesheet.api.TimeSheetEntry;
170+
import org.sakaiproject.timesheet.api.TimeSheetService;
170171
import org.sakaiproject.tool.api.SessionManager;
171172
import org.sakaiproject.tool.api.Tool;
172173
import org.sakaiproject.tool.api.ToolManager;
@@ -245,13 +246,12 @@ public class AssignmentServiceImpl implements AssignmentService, EntityTransferr
245246
@Setter private UserDirectoryService userDirectoryService;
246247
@Resource private UserMessagingService userMessagingService;
247248
@Setter private UserTimeService userTimeService;
249+
@Setter private TimeSheetService timeSheetService;
248250

249251
private boolean allowSubmitByInstructor;
250252
private boolean exposeContentReviewErrorsToUI;
251253
private boolean createGroupsOnImport;
252254

253-
private Pattern timesheetTimePattern;
254-
255255
private static ResourceLoader rb = new ResourceLoader("assignment");
256256

257257
public void init() {
@@ -286,16 +286,11 @@ public void init() {
286286
userMessagingService.importTemplateFromResourceXmlFile("templates/releaseResubmission.xml", AssignmentConstants.TOOL_ID + ".releaseresubmission");
287287
userMessagingService.importTemplateFromResourceXmlFile("templates/submission.xml", AssignmentConstants.TOOL_ID + ".submission");
288288
userMessagingService.importTemplateFromResourceXmlFile("templates/dueReminder.xml", AssignmentConstants.TOOL_ID + ".duereminder");
289-
290-
timesheetTimePattern = Pattern.compile(serverConfigurationService.getString("assignment.timesheet.timePattern", SAK_PROP_ASSIGNMENT_TIMESHEET_TIME_PATTERN_DEFAULT));
291289
}
292290

293291
@Override
294292
public boolean isTimeSheetEnabled(String siteId) {
295-
List<String> timesheetConfig = serverConfigurationService.getStringList(SAK_PROP_ASSIGNMENT_TIMESHEET_SITES_ALLOWED, Collections.singletonList("none"));
296-
297-
// TODO logic for determining whether this feature is enabled in the current site
298-
return Stream.of("all", siteId).filter(Objects::nonNull).anyMatch(timesheetConfig::contains);
293+
return timeSheetService.isTimeSheetEnabled(siteId);
299294
}
300295

301296
@Override
@@ -856,35 +851,48 @@ public Assignment addAssignment(String context) throws PermissionException {
856851
return assignment;
857852
}
858853

859-
@Override
860854
@Transactional
861-
public void newTimeSheetEntry(AssignmentSubmissionSubmitter submissionSubmitter, TimeSheetEntry timeSheetEntry) throws PermissionException {
855+
@Override
856+
public void saveTimeSheetEntry(AssignmentSubmissionSubmitter submissionSubmitter, TimeSheetEntry timeSheetEntry) throws PermissionException {
862857
if (submissionSubmitter != null && timeSheetEntry != null) {
863858
AssignmentSubmission submission = submissionSubmitter.getSubmission();
864859
String siteId = AssignmentReferenceReckoner.reckoner().submission(submission).reckon().getContext();
865860
if (!allowAddSubmission(siteId)) {
866861
throw new PermissionException(sessionManager.getCurrentSessionUserId(), SECURE_ADD_ASSIGNMENT_SUBMISSION, null);
867862
}
868-
assignmentRepository.newTimeSheetEntry(submissionSubmitter, timeSheetEntry);
863+
timeSheetEntry.setReference(AssignmentReferenceReckoner.reckoner().submission(submission).reckon().getReference());
864+
timeSheetService.create(timeSheetEntry);
869865
log.debug("Add time sheet entry for submitter: {}", submissionSubmitter);
870866
}
871867
}
872868

873-
@Override
874869
@Transactional
870+
@Override
875871
public void deleteTimeSheetEntry(Long timeSheetEntryId) throws PermissionException {
876-
TimeSheetEntry timeSheetEntry = getTimeSheetEntry(timeSheetEntryId);
877-
if (timeSheetEntry != null) {
878-
String siteId = AssignmentReferenceReckoner.reckoner().submission(timeSheetEntry.getAssignmentSubmissionSubmitter().getSubmission()).reckon().getContext();
879-
if (!allowAddSubmission(siteId)) {
880-
throw new PermissionException(sessionManager.getCurrentSessionUserId(), SECURE_UPDATE_ASSIGNMENT_SUBMISSION, null);
881-
}
882-
assignmentRepository.deleteTimeSheetEntry(timeSheetEntryId);
883-
log.debug("Deleting time sheet entry: {}", timeSheetEntryId);
872+
String timeSheetEntryReference = getTimeSheetEntryReference(timeSheetEntryId);
873+
if (StringUtils.isNotBlank(timeSheetEntryReference)) {
874+
String siteId = AssignmentReferenceReckoner.reckoner().reference(timeSheetEntryReference).reckon().getContext();
875+
if (!allowAddSubmission(siteId)) {
876+
throw new PermissionException(sessionManager.getCurrentSessionUserId(), SECURE_UPDATE_ASSIGNMENT_SUBMISSION, null);
877+
}
878+
timeSheetService.delete(timeSheetEntryId);
879+
log.debug("Deleting time sheet entry: {}", timeSheetEntryId);
880+
} else {
881+
log.warn("Attempted to delete time sheet entry: {} however it does not exist.", timeSheetEntryId);
882+
}
883+
}
884+
885+
@Override
886+
public List<TimeSheetEntry> getTimeSheetEntries(AssignmentSubmissionSubmitter submissionSubmitter) {
887+
if (submissionSubmitter != null) {
888+
String reference = AssignmentReferenceReckoner.reckoner().submission(submissionSubmitter.getSubmission()).reckon().getReference();
889+
return timeSheetService.getByReference(reference);
884890
} else {
885-
log.warn("Attempted to delete time sheet entry: {} however it does not exist.", timeSheetEntryId);
891+
// submission is null
892+
log.debug("SubmissionSubmitter is null");
893+
return null;
886894
}
887-
}
895+
}
888896

889897
public String getTimeSpent(AssignmentSubmission submission) {
890898
return submission.getSubmitters().stream().findAny().get().getTimeSpent();
@@ -1725,23 +1733,9 @@ public AssignmentSubmission getSubmission(String submissionId) throws Permission
17251733
return null;
17261734
}
17271735

1728-
@Override
1729-
public TimeSheetEntry getTimeSheetEntry(Long timeSheetId) throws PermissionException {
1730-
if (timeSheetId != null) {
1731-
TimeSheetEntry timeSheet = assignmentRepository.findTimeSheetEntry(timeSheetId);
1732-
if (timeSheet != null) {
1733-
String reference = AssignmentReferenceReckoner.reckoner().submission(timeSheet.getAssignmentSubmissionSubmitter().getSubmission()).reckon().getReference();
1734-
if (allowGetSubmission(reference)) {
1735-
return timeSheet;
1736-
} else {
1737-
throw new PermissionException(sessionManager.getCurrentSessionUserId(), SECURE_ACCESS_ASSIGNMENT_SUBMISSION, reference);
1738-
}
1739-
} else {
1740-
// timesheet not found
1741-
log.debug("TimeSheet does not exist {}", timeSheetId);
1742-
}
1743-
}
1744-
return null;
1736+
private String getTimeSheetEntryReference(Long timeSheetId) {
1737+
return timeSheetService.getTimeSheetEntryReference(timeSheetId);
1738+
17451739
}
17461740

17471741
@Override
@@ -5002,7 +4996,33 @@ private List<MultiGroupRecord> usersInMultipleGroups(String siteId, Collection<S
50024996
return dupes;
50034997
}
50044998

5005-
public boolean isValidTimesheetTime(String time) {
5006-
return timesheetTimePattern.matcher(time).matches();
4999+
@Override
5000+
public boolean existsTimeSheetEntries(AssignmentSubmissionSubmitter asnSubmissionSubmitter) {
5001+
AssignmentSubmission submission = asnSubmissionSubmitter.getSubmission();
5002+
String reference = AssignmentReferenceReckoner.reckoner().submission(submission).reckon().getReference();
5003+
return timeSheetService.existsAny(reference);
5004+
}
5005+
5006+
@Override
5007+
public boolean isValidTimeSheetTime(String time) {
5008+
return timeSheetService.isValidTimeSheetTime(time);
5009+
}
5010+
5011+
@Override
5012+
public String getTotalTimeSheet(AssignmentSubmissionSubmitter asnSubmissionSubmitter) {
5013+
AssignmentSubmission submission = asnSubmissionSubmitter.getSubmission();
5014+
String reference = AssignmentReferenceReckoner.reckoner().submission(submission).reckon().getReference();
5015+
return timeSheetService.getTotalTimeSheet(reference);
5016+
}
5017+
5018+
@Override
5019+
public Integer timeToInt(String time) {
5020+
return timeSheetService.timeToInt(time);
50075021
}
5022+
5023+
@Override
5024+
public String intToTime(int time) {
5025+
return timeSheetService.intToTime(time);
5026+
}
5027+
50085028
}

0 commit comments

Comments
 (0)