Update database schema.

Change MILESTONE.CLOSED to MILESTONE.CLOSED_DATE.
This commit is contained in:
takezoe
2013-06-23 03:00:29 +09:00
parent 49369f253a
commit bc607661a9
6 changed files with 17 additions and 15 deletions

View File

@@ -79,7 +79,7 @@ CREATE TABLE MILESTONE(
TITLE VARCHAR(100) NOT NULL, TITLE VARCHAR(100) NOT NULL,
DESCRIPTION TEXT, DESCRIPTION TEXT,
DUE_DATE TIMESTAMP, DUE_DATE TIMESTAMP,
CLOSED BOOLEAN NOT NULL CLOSED_DATE TIMESTAMP
); );
ALTER TABLE ACCOUNT ADD CONSTRAINT IDX_ACCOUNT_PK PRIMARY KEY (USER_NAME); ALTER TABLE ACCOUNT ADD CONSTRAINT IDX_ACCOUNT_PK PRIMARY KEY (USER_NAME);

View File

@@ -4,6 +4,7 @@ import jp.sf.amateras.scalatra.forms._
import service._ import service._
import util.{WritableRepositoryAuthenticator, ReadableRepositoryAuthenticator, UsersOnlyAuthenticator} import util.{WritableRepositoryAuthenticator, ReadableRepositoryAuthenticator, UsersOnlyAuthenticator}
import java.sql.Timestamp
class IssuesController extends IssuesControllerBase class IssuesController extends IssuesControllerBase
with IssuesService with RepositoryService with AccountService with IssuesService with RepositoryService with AccountService
@@ -126,7 +127,8 @@ trait IssuesControllerBase extends ControllerBase {
getMilestone(owner, repository, milestoneId) match { getMilestone(owner, repository, milestoneId) match {
case None => NotFound() case None => NotFound()
case Some(m) => { case Some(m) => {
updateMilestone(m.copy(closed = true)) val currentDate = new Timestamp(System.currentTimeMillis) // TODO move to trait?
updateMilestone(m.copy(closedDate = Some(currentDate)))
redirect("/%s/%s/issues/milestones".format(owner, repository)) redirect("/%s/%s/issues/milestones".format(owner, repository))
} }
} }
@@ -140,7 +142,7 @@ trait IssuesControllerBase extends ControllerBase {
getMilestone(owner, repository, milestoneId) match { getMilestone(owner, repository, milestoneId) match {
case None => NotFound() case None => NotFound()
case Some(m) => { case Some(m) => {
updateMilestone(m.copy(closed = false)) updateMilestone(m.copy(closedDate = None))
redirect("/%s/%s/issues/milestones".format(owner, repository)) redirect("/%s/%s/issues/milestones".format(owner, repository))
} }
} }

View File

@@ -9,10 +9,10 @@ object Milestones extends Table[Milestone]("MILESTONE") {
def title = column[String]("TITLE") def title = column[String]("TITLE")
def description = column[String]("DESCRIPTION") def description = column[String]("DESCRIPTION")
def dueDate = column[java.sql.Date]("DUE_DATE") // TODO convert java.util.Date later def dueDate = column[java.sql.Date]("DUE_DATE") // TODO convert java.util.Date later
def closed = column[Boolean]("CLOSED") def closedDate = column[java.sql.Timestamp]("CLOSED_DATE")
def ins = userName ~ repositoryName ~ title ~ description.? ~ dueDate.? ~ closed def ins = userName ~ repositoryName ~ title ~ description.? ~ dueDate.? ~ closedDate.?
def * = userName ~ repositoryName ~ milestoneId ~ title ~ description.? ~ dueDate.? ~ closed <> (Milestone, Milestone.unapply _) def * = userName ~ repositoryName ~ milestoneId ~ title ~ description.? ~ dueDate.? ~ closedDate.? <> (Milestone, Milestone.unapply _)
} }
case class Milestone( case class Milestone(
@@ -22,4 +22,4 @@ case class Milestone(
title: String, title: String,
description: Option[String], description: Option[String],
dueDate: Option[java.sql.Date], dueDate: Option[java.sql.Date],
closed: Boolean) closedDate: Option[java.sql.Timestamp])

View File

@@ -52,18 +52,18 @@ trait IssuesService {
def createMilestone(owner: String, repository: String, def createMilestone(owner: String, repository: String,
title: String, description: Option[String], dueDate: Option[java.sql.Date]): Unit = { title: String, description: Option[String], dueDate: Option[java.sql.Date]): Unit = {
Milestones.ins insert (owner, repository, title, description, dueDate, false) Milestones.ins insert (owner, repository, title, description, dueDate, None)
} }
def updateMilestone(milestone: Milestone): Unit = def updateMilestone(milestone: Milestone): Unit =
Query(Milestones) Query(Milestones)
.filter { m => (m.userName is milestone.userName.bind) && (m.repositoryName is milestone.repositoryName.bind) && (m.milestoneId is milestone.milestoneId.bind)} .filter { m => (m.userName is milestone.userName.bind) && (m.repositoryName is milestone.repositoryName.bind) && (m.milestoneId is milestone.milestoneId.bind)}
.map { m => m.title ~ m.description.? ~ m.dueDate.? ~ m.closed } .map { m => m.title ~ m.description.? ~ m.dueDate.? ~ m.closedDate.? }
.update ( .update (
milestone.title, milestone.title,
milestone.description, milestone.description,
milestone.dueDate, milestone.dueDate,
milestone.closed) milestone.closedDate)
def getMilestone(owner: String, repository: String, milestoneId: Int): Option[Milestone] = def getMilestone(owner: String, repository: String, milestoneId: Int): Option[Milestone] =
Query(Milestones) Query(Milestones)

View File

@@ -28,7 +28,7 @@
@if(milestone.isEmpty){ @if(milestone.isEmpty){
<input type="submit" class="btn" value="Create milestone"/> <input type="submit" class="btn" value="Create milestone"/>
} else { } else {
@if(milestone.get.closed){ @if(milestone.get.closedDate.isDefined){
<input type="button" class="btn" value="Open" id="open" <input type="button" class="btn" value="Open" id="open"
onclick="location.href='@path/@repository.owner/@repository.name/issues/milestones/@milestone.get.milestoneId/close';"/> onclick="location.href='@path/@repository.owner/@repository.name/issues/milestones/@milestone.get.milestoneId/close';"/>
} else { } else {

View File

@@ -9,13 +9,13 @@
<ul class="nav nav-pills nav-stacked"> <ul class="nav nav-pills nav-stacked">
<li@if(state == "open"){ class="active"}> <li@if(state == "open"){ class="active"}>
<a href="?state=open"> <a href="?state=open">
<span style="float: right; font-weight: bold;">@milestones.filter(!_.closed).size</span> <span style="float: right; font-weight: bold;">@milestones.filter(_.closedDate.isEmpty).size</span>
Open Milestones Open Milestones
</a> </a>
</li> </li>
<li@if(state == "closed"){ class="active"}> <li@if(state == "closed"){ class="active"}>
<a href="?state=closed"> <a href="?state=closed">
<span style="float: right; font-weight: bold;">@milestones.filter(_.closed).size</span> <span style="float: right; font-weight: bold;">@milestones.filter(_.closedDate.isDefined).size</span>
Closed Milestones Closed Milestones
</a> </a>
</li> </li>
@@ -27,7 +27,7 @@
</div> </div>
<div class="span9"> <div class="span9">
<table class="table table-bordered table-hover"> <table class="table table-bordered table-hover">
@defining(milestones.filter(milestone => if(state == "open") !milestone.closed else milestone.closed)){ milestones => @defining(milestones.filter(m => if(state == "open") m.closedDate.isEmpty else m.closedDate.isDefined)){ milestones =>
@milestones.map { milestone => @milestones.map { milestone =>
<tr> <tr>
<td> <td>
@@ -45,7 +45,7 @@
<div class="pull-right"> <div class="pull-right">
@if(isWritable){ @if(isWritable){
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/edit">Edit <a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/edit">Edit
@if(milestone.closed){ @if(milestone.closedDate.isDefined){
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/open">Open</a> <a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/open">Open</a>
} else { } else {
<a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/close">Close</a> <a href="@path/@repository.owner/@repository.name/issues/milestones/@milestone.milestoneId/close">Close</a>