(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,20 +24,19 @@ 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")
redirect(redirectUrl.asInstanceOf[String]) redirect(redirectUrl.asInstanceOf[String])
}.getOrElse { }.getOrElse {
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,47 +1,73 @@
@()(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>
<input type="text" name="name" id="name" /> <div class="btn-group" style="margin-bottom: 10px;" id="owner-dropdown">
<span id="error-name" class="error"></span> <button class="btn dropdown-toggle" data-toggle="dropdown">
</fieldset> <strong>@avatar(loginAccount.get.userName, 20) @loginAccount.get.userName</strong>
<fieldset> <span class="caret"></span>
<label for="description"><strong>Description</strong> (optional)</label> </button>
<input type="text" name="description" id="description" style="width: 95%;"/> <ul class="dropdown-menu">
</fieldset> <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>
<fieldset class="margin"> @groupNames.map { groupName =>
<label> <li><a href="javascript:void(0);" data-name="@groupName"><i class="icon-white"></i> <span>@avatar(groupName, 20) @groupName</span></a></li>
<input type="radio" name="isPrivate" value="false" checked> }
<strong>Public</strong><br> </ul>
<div> <input type="hidden" name="owner" id="owner" />
<span class="note">All users and guests can read this repository.</span>
</div> </div>
</label> /
</fieldset> <input type="text" name="name" id="name" />
<fieldset> <span id="error-name" class="error"></span>
<label> </fieldset>
<input type="radio" name="isPrivate" value="true"> <fieldset>
<strong>Private</strong><br> <label for="description"><strong>Description</strong> (optional)</label>
<div> <input type="text" name="description" id="description" style="width: 95%;"/>
<span class="note">Only collaborators can read this repository.</span> </fieldset>
</div> <fieldset class="margin">
</label> <label>
</fieldset> <input type="radio" name="isPrivate" value="false" checked>
<fieldset class="margin"> <strong>Public</strong><br>
<label for="createReadme"> <div>
<input type="checkbox" name="createReadme" id="createReadme"/> <span class="note">All users and guests can read this repository.</span>
<strong>Initialize this repository with a README</strong> </div>
<div> </label>
<span class="note">This will allow you to <code>git clone</code> the repository immediately.</span> </fieldset>
</div> <fieldset>
</label> <label>
</fieldset> <input type="radio" name="isPrivate" value="true">
<fieldset class="margin"> <strong>Private</strong><br>
<input type="submit" class="btn btn-success" value="Create repository"/> <div>
</fieldset> <span class="note">Only collaborators can read this repository.</span>
</form> </div>
</label>
</fieldset>
<fieldset class="margin">
<label for="createReadme">
<input type="checkbox" name="createReadme" id="createReadme"/>
<strong>Initialize this repository with a README</strong>
<div>
<span class="note">This will allow you to <code>git clone</code> the repository immediately.</span>
</div>
</label>
</fieldset>
<fieldset class="margin">
<input type="submit" class="btn btn-success" value="Create repository"/>
</fieldset>
</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>