From 8a050491f98e0938ccf060ac31f19114b6c84ba2 Mon Sep 17 00:00:00 2001 From: Tom Zhao <tom.zhao@dsv.su.se> Date: Wed, 2 Apr 2025 12:44:24 +0200 Subject: [PATCH] 87: Add clone functionality --- .../se/su/dsv/scipro/project/Project.java | 16 ++++++++++ .../se/su/dsv/scipro/reviewing/Decision.java | 19 ++++++++++++ .../scipro/reviewing/ReviewerApproval.java | 30 +++++++++++++++++++ .../scipro/reviewing/RoughDraftApproval.java | 15 +++++++++- .../V7__project_parent_phase2_review.sql | 12 ++++++++ 5 files changed, 91 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/se/su/dsv/scipro/project/Project.java b/core/src/main/java/se/su/dsv/scipro/project/Project.java index 9a9e469738..7e2a9dc6ad 100755 --- a/core/src/main/java/se/su/dsv/scipro/project/Project.java +++ b/core/src/main/java/se/su/dsv/scipro/project/Project.java @@ -36,6 +36,9 @@ import java.util.Set; import java.util.SortedSet; import java.util.TreeSet; import java.util.stream.Collectors; + +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; import se.su.dsv.scipro.data.dataobjects.Member; import se.su.dsv.scipro.reusable.SciProUtilities; import se.su.dsv.scipro.system.DegreeType; @@ -121,6 +124,11 @@ public class Project extends DomainObject { @Column(name = "root_project_id") private Long rootProjectId; + @Basic + @Column(name = "clone_timestamp") + @Temporal(TemporalType.TIMESTAMP) + private Date cloneTimestamp; + // ---------------------------------------------------------------------------------- // Embedded JPA-mapping // ---------------------------------------------------------------------------------- @@ -389,6 +397,14 @@ public class Project extends DomainObject { this.rootProjectId = rootProjectId; } + public Date getCloneTimestamp() { + return cloneTimestamp; + } + + public void setCloneTimestamp(Date cloneTimestamp) { + this.cloneTimestamp = cloneTimestamp; + } + // ---------------------------------------------------------------------------------- // Methods Common To All Objects // ---------------------------------------------------------------------------------- diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/Decision.java b/core/src/main/java/se/su/dsv/scipro/reviewing/Decision.java index 67d701cdc9..b3b4ebc635 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/Decision.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/Decision.java @@ -196,6 +196,25 @@ public class Decision { decideWithDecisionDate(status, reason, attachment, Instant.now()); } + Decision cloneToReviewerApproval(RoughDraftApproval roughDraftApproval) { + Decision clonedDecision = new Decision(); + clonedDecision.reviewerApproval = roughDraftApproval; + + clonedDecision.status = this.status; + clonedDecision.reason = this.reason; + clonedDecision.comment = this.comment; + clonedDecision.requested = this.requested; + clonedDecision.decisionDate = this.decisionDate; + clonedDecision.deadline = this.deadline; + clonedDecision.reviewerAssignedAt = this.reviewerAssignedAt; + + clonedDecision.assignedReviewer = this.assignedReviewer; + clonedDecision.attachment = this.attachment; + clonedDecision.thesis = this.thesis; + + return clonedDecision; + } + private void decideWithDecisionDate( final Status status, final String reason, diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerApproval.java b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerApproval.java index 9e91d2fca1..0f25dd4aa4 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerApproval.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/ReviewerApproval.java @@ -1,6 +1,8 @@ package se.su.dsv.scipro.reviewing; +import jakarta.persistence.Basic; import jakarta.persistence.CascadeType; +import jakarta.persistence.Column; import jakarta.persistence.DiscriminatorColumn; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; @@ -16,6 +18,9 @@ import java.util.Date; import java.util.LinkedList; import java.util.List; import java.util.Optional; + +import jakarta.persistence.Temporal; +import jakarta.persistence.TemporalType; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.project.Project; import se.su.dsv.scipro.system.DomainObject; @@ -32,6 +37,15 @@ public abstract class ReviewerApproval extends DomainObject { @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; + @Basic + @Column(name = "is_cloned") + protected Boolean isCloned = false; + + @Basic + @Column(name = "clone_timestamp") + @Temporal(TemporalType.TIMESTAMP) + protected Date cloneTimestamp; + // ---------------------------------------------------------------------------------- // JPA-mappings of foreign keys in this table (reviewer_approval) referencing other // tables. @@ -59,6 +73,22 @@ public abstract class ReviewerApproval extends DomainObject { return this.project; } + public Boolean getCloned() { + return isCloned; + } + + public void setCloned(Boolean cloned) { + isCloned = cloned; + } + + public Date getCloneTimestamp() { + return cloneTimestamp; + } + + public void setCloneTimestamp(Date cloneDate) { + this.cloneTimestamp = cloneDate; + } + // ---------------------------------------------------------------------------------- // Other methods // ---------------------------------------------------------------------------------- diff --git a/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApproval.java b/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApproval.java index bd8854b67b..1e9ca0b8a3 100644 --- a/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApproval.java +++ b/core/src/main/java/se/su/dsv/scipro/reviewing/RoughDraftApproval.java @@ -1,7 +1,9 @@ package se.su.dsv.scipro.reviewing; import jakarta.persistence.Entity; -import java.util.*; + +import java.time.Instant; +import java.util.Date; import se.su.dsv.scipro.file.FileReference; import se.su.dsv.scipro.project.Project; @@ -24,4 +26,15 @@ public class RoughDraftApproval extends ReviewerApproval { public Step getStep() { return Step.ROUGH_DRAFT_APPROVAL; } + + public RoughDraftApproval cloneToProject(final Project newProject) { + RoughDraftApproval rda = new RoughDraftApproval(); + rda.project = newProject; + this.decisions.forEach(decision -> rda.decisions.add(decision.cloneToReviewerApproval(rda))); + + rda.isCloned = true; + rda.cloneTimestamp = Date.from(Instant.now()); + + return rda; + } } diff --git a/core/src/main/resources/db/migration/V7__project_parent_phase2_review.sql b/core/src/main/resources/db/migration/V7__project_parent_phase2_review.sql index 2fa8341982..dd5e3e588c 100644 --- a/core/src/main/resources/db/migration/V7__project_parent_phase2_review.sql +++ b/core/src/main/resources/db/migration/V7__project_parent_phase2_review.sql @@ -5,6 +5,9 @@ alter table `project` alter table `project` add column `root_project_id` bigint(20) null default null; +alter table `project` + add column `clone_timestamp` datetime not null default null; + alter table `project` add constraint fk_project_parent_project_id_project_id foreign key (parent_project_id) references project(id) @@ -14,3 +17,12 @@ alter table `project` add constraint fk_project_root_project_id_project_id foreign key (root_project_id) references project(id) on delete cascade on update cascade; + + +alter table `reviewer_approval` + add column `is_cloned` bit(1) not null default false; + +alter table `reviewer_approval` + add column `clone_timestamp` datetime not null default null; + +update table `reviewer_approval` set is_cloned = false; \ No newline at end of file