(refs #8)Implementing repository creation for group.

This commit is contained in:
takezoe
2013-07-23 22:05:30 +09:00
parent 7150befa54
commit b760361184
5 changed files with 109 additions and 74 deletions

View File

@@ -16,12 +16,13 @@ class CreateRepositoryController extends CreateRepositoryControllerBase
* Creates new repository. * Creates new repository.
*/ */
trait CreateRepositoryControllerBase extends ControllerBase { trait CreateRepositoryControllerBase extends ControllerBase {
self: RepositoryService with WikiService with LabelsService with ActivityService self: RepositoryService with AccountService with WikiService with LabelsService with ActivityService
with UsersAuthenticator => with UsersAuthenticator =>
case class RepositoryCreationForm(name: String, description: Option[String], isPrivate: Boolean, createReadme: Boolean) case class RepositoryCreationForm(owner: String, name: String, description: Option[String], isPrivate: Boolean, createReadme: Boolean)
val form = mapping( val form = mapping(
"owner" -> trim(label("Owner" , text(required, maxlength(40), identifier))), // TODO check existence.
"name" -> trim(label("Repository name", text(required, maxlength(40), identifier, unique))), "name" -> trim(label("Repository name", text(required, maxlength(40), identifier, unique))),
"description" -> trim(label("Description" , optional(text()))), "description" -> trim(label("Description" , optional(text()))),
"isPrivate" -> trim(label("Repository Type", boolean())), "isPrivate" -> trim(label("Repository Type", boolean())),
@@ -32,7 +33,7 @@ trait CreateRepositoryControllerBase extends ControllerBase {
* Show the new repository form. * Show the new repository form.
*/ */
get("/new")(usersOnly { get("/new")(usersOnly {
html.newrepo() html.newrepo(getGroupsByUserName(context.loginAccount.get.userName))
}) })
/** /**
@@ -43,22 +44,22 @@ trait CreateRepositoryControllerBase extends ControllerBase {
val loginUserName = loginAccount.userName val loginUserName = loginAccount.userName
// Insert to the database at first // Insert to the database at first
createRepository(form.name, loginUserName, form.description, form.isPrivate) createRepository(form.name, form.owner, form.description, form.isPrivate)
// Insert default labels // Insert default labels
createLabel(loginUserName, form.name, "bug", "fc2929") createLabel(form.owner, form.name, "bug", "fc2929")
createLabel(loginUserName, form.name, "duplicate", "cccccc") createLabel(form.owner, form.name, "duplicate", "cccccc")
createLabel(loginUserName, form.name, "enhancement", "84b6eb") createLabel(form.owner, form.name, "enhancement", "84b6eb")
createLabel(loginUserName, form.name, "invalid", "e6e6e6") createLabel(form.owner, form.name, "invalid", "e6e6e6")
createLabel(loginUserName, form.name, "question", "cc317c") createLabel(form.owner, form.name, "question", "cc317c")
createLabel(loginUserName, form.name, "wontfix", "ffffff") createLabel(form.owner, form.name, "wontfix", "ffffff")
// Create the actual repository // Create the actual repository
val gitdir = getRepositoryDir(loginUserName, form.name) val gitdir = getRepositoryDir(form.owner, form.name)
JGitUtil.initRepository(gitdir) JGitUtil.initRepository(gitdir)
if(form.createReadme){ if(form.createReadme){
val tmpdir = getInitRepositoryDir(loginUserName, form.name) val tmpdir = getInitRepositoryDir(form.owner, form.name)
try { try {
// Clone the repository // Clone the repository
Git.cloneRepository.setURI(gitdir.toURI.toString).setDirectory(tmpdir).call Git.cloneRepository.setURI(gitdir.toURI.toString).setDirectory(tmpdir).call
@@ -86,21 +87,23 @@ trait CreateRepositoryControllerBase extends ControllerBase {
} }
// Create Wiki repository // Create Wiki repository
createWikiRepository(loginAccount, form.name) createWikiRepository(loginAccount, form.owner, form.name)
// Record activity // Record activity
recordCreateRepositoryActivity(loginUserName, form.name, loginUserName) recordCreateRepositoryActivity(loginUserName, form.name, form.owner)
// redirect to the repository // redirect to the repository
redirect(s"/${loginUserName}/${form.name}") redirect(s"/${form.owner}/${form.name}")
}) })
/** /**
* Duplicate check for the repository name. * Duplicate check for the repository name.
*/ */
private def unique: Constraint = new Constraint(){ private def unique: Constraint = new Constraint(){
def validate(name: String, value: String): Option[String] = def validate(name: String, value: String): Option[String] = {
// TODO fix to retreive user name from request parameter
getRepositoryNamesOfUser(context.loginAccount.get.userName).find(_ == value).map(_ => "Repository already exists.") getRepositoryNamesOfUser(context.loginAccount.get.userName).find(_ == value).map(_ => "Repository already exists.")
} }
}
} }

View File

@@ -24,12 +24,10 @@ trait SignInControllerBase extends ControllerBase { self: SystemSettingsService
} }
post("/signin", form){ form => post("/signin", form){ form =>
val account = getAccountByUserName(form.userName) getAccountByUserName(form.userName).collect {
if(account.isEmpty || account.get.password != sha1(form.password)){ case account if(!account.isGroupAccount && account.password == sha1(form.password)) => {
redirect("/signin") session.setAttribute("LOGIN_ACCOUNT", account)
} else { updateLastLoginDate(account.userName)
session.setAttribute("LOGIN_ACCOUNT", account.get)
updateLastLoginDate(account.get.userName)
session.get("REDIRECT").map { redirectUrl => session.get("REDIRECT").map { redirectUrl =>
session.removeAttribute("REDIRECT") session.removeAttribute("REDIRECT")
@@ -38,6 +36,7 @@ trait SignInControllerBase extends ControllerBase { self: SystemSettingsService
redirect("/") redirect("/")
} }
} }
} getOrElse redirect("/signin")
} }
get("/signout"){ get("/signout"){

View File

@@ -74,4 +74,11 @@ trait AccountService {
.map(_.userName) .map(_.userName)
.list .list
def getGroupsByUserName(userName: String): List[String] =
Query(GroupMembers)
.filter(_.userName is userName.bind)
.sortBy(_.groupName)
.map(_.groupName)
.list
} }

View File

@@ -63,16 +63,16 @@ object WikiService {
trait WikiService { trait WikiService {
import WikiService._ import WikiService._
def createWikiRepository(owner: model.Account, repository: String): Unit = { def createWikiRepository(loginAccount: model.Account, owner: String, repository: String): Unit = {
lock(owner.userName, repository){ lock(owner, repository){
val dir = Directory.getWikiRepositoryDir(owner.userName, repository) val dir = Directory.getWikiRepositoryDir(owner, repository)
if(!dir.exists){ if(!dir.exists){
try { try {
JGitUtil.initRepository(dir) JGitUtil.initRepository(dir)
saveWikiPage(owner.userName, repository, "Home", "Home", s"Welcome to the ${repository} wiki!!", owner, "Initial Commit") saveWikiPage(owner, repository, "Home", "Home", s"Welcome to the ${repository} wiki!!", loginAccount, "Initial Commit")
} finally { } finally {
// once delete cloned repository because initial cloned repository does not have 'branch.master.merge' // once delete cloned repository because initial cloned repository does not have 'branch.master.merge'
FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner.userName, repository)) FileUtils.deleteDirectory(Directory.getWikiWorkDir(owner, repository))
} }
} }
} }

View File

@@ -1,10 +1,25 @@
@()(implicit context: app.Context) @(groupNames: List[String])(implicit context: app.Context)
@import context._ @import context._
@import view.helpers._
@main("Create a New Repository"){ @main("Create a New Repository"){
<div style="width: 600px; margin: 10px auto;"> <div style="width: 600px; margin: 10px auto;">
<form id="form" method="post" action="@path/new" validate="true"> <form id="form" method="post" action="@path/new" validate="true">
<fieldset> <fieldset>
<label for="name"><strong>Repository name</strong></label> <label for="name"><strong>Repository name</strong></label>
<div class="btn-group" style="margin-bottom: 10px;" id="owner-dropdown">
<button class="btn dropdown-toggle" data-toggle="dropdown">
<strong>@avatar(loginAccount.get.userName, 20) @loginAccount.get.userName</strong>
<span class="caret"></span>
</button>
<ul class="dropdown-menu">
<li><a href="javascript:void(0);" data-name="@loginAccount.get.userName"><i class="icon-ok"></i> <span>@avatar(loginAccount.get.userName, 20) @loginAccount.get.userName</span></a></li>
@groupNames.map { groupName =>
<li><a href="javascript:void(0);" data-name="@groupName"><i class="icon-white"></i> <span>@avatar(groupName, 20) @groupName</span></a></li>
}
</ul>
<input type="hidden" name="owner" id="owner" />
</div>
/
<input type="text" name="name" id="name" /> <input type="text" name="name" id="name" />
<span id="error-name" class="error"></span> <span id="error-name" class="error"></span>
</fieldset> </fieldset>
@@ -42,6 +57,17 @@
<fieldset class="margin"> <fieldset class="margin">
<input type="submit" class="btn btn-success" value="Create repository"/> <input type="submit" class="btn btn-success" value="Create repository"/>
</fieldset> </fieldset>
</form> </form>
</div> </div>
} }
<script>
$('#owner-dropdown a').click(function(){
var userName = $(this).data('name');
$('#owner').val(userName);
$('#owner-dropdown i').attr('class', 'icon-white');
$(this).find('i').attr('class', 'icon-ok');
$('#owner-dropdown strong').html($(this).find('span').html());
});
</script>