mirror of
https://github.com/gitbucket/gitbucket.git
synced 2025-11-07 22:15:51 +01:00
Update database schema.
Change MILESTONE.CLOSED to MILESTONE.CLOSED_DATE.
This commit is contained in:
@@ -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);
|
||||||
|
|||||||
@@ -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))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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])
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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>
|
||||||
|
|||||||
Reference in New Issue
Block a user