[Notice] Announcing the End of Demo Server [Read me]
Keesun Baik 2013-04-08
#HIVE-40 마일스톤 이름 중복되지 않도록 처리
@643d85e2f5034d90d1e551f71aa10db746ccce54
app/controllers/MilestoneApp.java
--- app/controllers/MilestoneApp.java
+++ app/controllers/MilestoneApp.java
@@ -4,6 +4,7 @@
 import models.enumeration.*;
 import play.data.*;
 import play.mvc.*;
+import utils.Constants;
 import views.html.milestone.*;
 
 import java.util.*;
@@ -56,6 +57,7 @@
         if(project == null ) {
             return notFound();
         }
+        validate(project, milestoneForm);
         if (milestoneForm.hasErrors()) {
             return ok(create.render("title.newMilestone", milestoneForm, project));
         } else {
@@ -63,6 +65,14 @@
             newMilestone.project = project;
             Milestone.create(newMilestone);
             return redirect(routes.MilestoneApp.manageMilestones(userName, projectName));
+        }
+    }
+
+    private static void validate(Project project, Form<Milestone> milestoneForm) {
+        // 중복된 title로 만들 수 없다.
+        if (!Milestone.isUniqueProjectIdAndTitle(project.id, milestoneForm.field("title").value())) {
+            milestoneForm.reject("title", "milestone.title.duplicated");
+            flash(Constants.WARNING, "milestone.title.duplicated");
         }
     }
 
@@ -95,8 +105,11 @@
         if(project == null ) {
             return notFound();
         }
-
         Form<Milestone> milestoneForm = new Form<Milestone>(Milestone.class).bindFromRequest();
+        Milestone original = Milestone.findById(milestoneId);
+        if(!original.title.equals(milestoneForm.field("title").value())) {
+            validate(project, milestoneForm);
+        }
         if (milestoneForm.hasErrors()) {
             return ok(edit.render("title.editMilestone", milestoneForm, milestoneId, project));
         } else {
app/models/Milestone.java
--- app/models/Milestone.java
+++ app/models/Milestone.java
@@ -23,6 +23,7 @@
     public Long id;
 
     @Constraints.Required
+    @Column(unique = true)
     public String title;
 
     @Constraints.Required
@@ -63,7 +64,7 @@
     public int getNumOpenIssues() {
         return Issue.finder.where().eq("milestone", this).eq("state", State.OPEN).findRowCount();
     }
-    
+
     public int getNumTotalIssues() {
         return issues.size();
     }
@@ -167,4 +168,9 @@
         }
         return options;
     }
+
+    public static boolean isUniqueProjectIdAndTitle(Long projectId, String title) {
+        int count = find.where().eq("project.id", projectId).eq("title", title).findRowCount();
+        return (count == 0);
+    }
 }
conf/messages.en
--- conf/messages.en
+++ conf/messages.en
@@ -97,6 +97,7 @@
 milestone.menu.new = New
 sort.by.dueDate = Due Date
 sort.by.completionRate = Completeness
+milestone.title.duplicated = Title is duplicated.
 
 #Issue
 issue.stateType.all = All
@@ -279,7 +280,7 @@
 user.logout.success = Logout successfully
 user.isAlreadySignupUser = HAVE AN ACCOUNT ALREADY?
 user.signupId = ID (lower case)
-user.signupBtn = Sign Up 
+user.signupBtn = Sign Up
 
 #Time
 time.just = just now
conf/messages.ko
--- conf/messages.ko
+++ conf/messages.ko
@@ -39,7 +39,7 @@
 menu.wiki = 위키
 menu.admin = 프로젝트 관리
 menu.siteAdmin = 사이트 관리
-menu.task = 작업 
+menu.task = 작업
 
 message.warning = 경고
 message.success = 성공
@@ -99,6 +99,7 @@
 milestone.none = 없음
 sort.by.dueDate = 완료일 순
 sort.by.completionRate = 완료율 순
+milestone.title.duplicated = 마일스톤 제목이 다른것과 중복 됩니다. 다른 제목을 사용하세요.
 
 #Issue
 issue.state = 상태
@@ -355,7 +356,7 @@
 validation.invalidEmail = 올바른 이메일을 입력해 주세요.
 validation.required = 필수 항목 입니다.
 validation.duplicated = 이미 존재합니다!
-validation.allowedCharsForLoginId = 아이디는 알파벳 숫자 - _ . 를 포함할 수 있으나 _ . 로 시작하거나 끝날 수 없습니다.
+validation.allowedCharsForLoginId = 아이디는 알파벳 숫자 - _ . 를 포함할 수 있으나 _ . 로 시작하거나 끝날 수 없습니다.
 
 #Unauthorized
 auth.unauthorized.title = 접근 권한 오류
test/models/MilestoneTest.java
--- test/models/MilestoneTest.java
+++ test/models/MilestoneTest.java
@@ -242,4 +242,19 @@
         assertThat(m5.getNumTotalIssues()).describedAs("number of total issues should be 1").isEqualTo(1);
         assertThat(m5.getCompletionRate()).isEqualTo(100);
     }
+
+    @Test
+    public void isUniqueProjectIdAndTitle() {
+        //Given
+        //When
+        boolean isUnique = Milestone.isUniqueProjectIdAndTitle(1l, "v.0.1");
+        //Then
+        assertThat(isUnique == false);
+
+        //Given
+        //When
+        isUnique = Milestone.isUniqueProjectIdAndTitle(1l, "unique milestone");
+        //Then
+        assertThat(isUnique == true);
+    }
 }
Add a comment
List