Added the ability to create a new project with another one as template.
This commit is contained in:
parent
061c806588
commit
4f23ea4dd5
@ -109,6 +109,20 @@ class IDF_Form_Admin_ProjectCreate extends Pluf_Form
|
|||||||
'cols' => 40),
|
'cols' => 40),
|
||||||
'widget' => 'Pluf_Form_Widget_TextareaInput',
|
'widget' => 'Pluf_Form_Widget_TextareaInput',
|
||||||
));
|
));
|
||||||
|
|
||||||
|
$projects = array('--' => '--');
|
||||||
|
foreach (Pluf::factory('IDF_Project')->getList(array('order' => 'name ASC')) as $proj) {
|
||||||
|
$projects[$proj->name] = $proj->shortname;
|
||||||
|
}
|
||||||
|
$this->fields['template'] = new Pluf_Form_Field_Varchar(
|
||||||
|
array('required' => false,
|
||||||
|
'label' => __('Project template'),
|
||||||
|
'initial' => '--',
|
||||||
|
'help_text' => __('Use the given project to initialize the new project. Access rights and general configuration will be taken from the template project.'),
|
||||||
|
'widget' => 'Pluf_Form_Widget_SelectInput',
|
||||||
|
'widget_attrs' => array('choices' => $projects),
|
||||||
|
));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* [signal]
|
* [signal]
|
||||||
*
|
*
|
||||||
@ -229,12 +243,67 @@ class IDF_Form_Admin_ProjectCreate extends Pluf_Form
|
|||||||
$this->cleaned_data[$key] : '';
|
$this->cleaned_data[$key] : '';
|
||||||
$conf->setVal($key, $this->cleaned_data[$key]);
|
$conf->setVal($key, $this->cleaned_data[$key]);
|
||||||
}
|
}
|
||||||
|
if ($this->cleaned_data['template'] != '--') {
|
||||||
|
// Find the template project
|
||||||
|
$sql = new Pluf_SQL('shortname=%s',
|
||||||
|
array($this->cleaned_data['template']));
|
||||||
|
$tmpl = Pluf::factory('IDF_Project')->getOne(array('filter' => $sql->gen()));
|
||||||
|
$tmplconf = new IDF_Conf();
|
||||||
|
$tmplconf->setProject($tmpl);
|
||||||
|
// We need to get all the configuration variables we want from
|
||||||
|
// the old project and put them into the new project.
|
||||||
|
$props = array(
|
||||||
|
'labels_download_predefined',
|
||||||
|
'labels_download_one_max',
|
||||||
|
'labels_wiki_predefined',
|
||||||
|
'labels_wiki_one_max',
|
||||||
|
'labels_issue_open',
|
||||||
|
'labels_issue_closed',
|
||||||
|
'labels_issue_predefined',
|
||||||
|
'labels_issue_one_max',
|
||||||
|
'webhook_url',
|
||||||
|
'downloads_access_rights',
|
||||||
|
'review_access_rights',
|
||||||
|
'wiki_access_rights',
|
||||||
|
'source_access_rights',
|
||||||
|
'issues_access_rights',
|
||||||
|
'downloads_notification_email',
|
||||||
|
'review_notification_email',
|
||||||
|
'wiki_notification_email',
|
||||||
|
'source_notification_email',
|
||||||
|
'issues_notification_email',
|
||||||
|
);
|
||||||
|
foreach ($props as $prop) {
|
||||||
|
$conf->setVal($prop, $tmplconf->getVal($prop));
|
||||||
|
}
|
||||||
|
}
|
||||||
$project->created();
|
$project->created();
|
||||||
IDF_Form_MembersConf::updateMemberships($project,
|
if ($this->cleaned_data['template'] == '--') {
|
||||||
$this->cleaned_data);
|
IDF_Form_MembersConf::updateMemberships($project,
|
||||||
|
$this->cleaned_data);
|
||||||
|
} else {
|
||||||
|
// Get the membership of the template $tmpl
|
||||||
|
IDF_Form_MembersConf::updateMemberships($project,
|
||||||
|
$tmpl->getMembershipData('string'));
|
||||||
|
}
|
||||||
$project->membershipsUpdated();
|
$project->membershipsUpdated();
|
||||||
return $project;
|
return $project;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check that the template project exists.
|
||||||
|
*/
|
||||||
|
public function clean_template()
|
||||||
|
{
|
||||||
|
if ($this->cleaned_data['template'] == '--') {
|
||||||
|
return $this->cleaned_data['template'];
|
||||||
|
}
|
||||||
|
$sql = new Pluf_SQL('shortname=%s', array($this->cleaned_data['template']));
|
||||||
|
if (Pluf::factory('IDF_Project')->getOne(array('filter' => $sql->gen())) == null) {
|
||||||
|
throw new Pluf_Form_Invalid(__('This project is not available.'));
|
||||||
|
}
|
||||||
|
return $this->cleaned_data['template'];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -118,6 +118,9 @@ class IDF_Views_Admin
|
|||||||
/**
|
/**
|
||||||
* Creation of a project.
|
* Creation of a project.
|
||||||
*
|
*
|
||||||
|
* A project can use another project as template. In that case,
|
||||||
|
* everything but the data in the input at creation time is
|
||||||
|
* reused, including the wiki pages.
|
||||||
*/
|
*/
|
||||||
public $projectCreate_precond = array('Pluf_Precondition::staffRequired');
|
public $projectCreate_precond = array('Pluf_Precondition::staffRequired');
|
||||||
public function projectCreate($request, $match)
|
public function projectCreate($request, $match)
|
||||||
|
@ -53,21 +53,28 @@
|
|||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr>
|
||||||
|
<th>{$form.f.template.labelTag}</th>
|
||||||
|
<td>{if $form.f.template.errors}{$form.f.template.fieldErrors}{/if}
|
||||||
|
{$form.f.template|unsafe}<br />
|
||||||
|
<span class="helptext">{$form.f.template.help_text}</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr class="no-template">
|
||||||
<th><strong>{$form.f.owners.labelTag}:</strong></th>
|
<th><strong>{$form.f.owners.labelTag}:</strong></th>
|
||||||
<td>
|
<td>
|
||||||
{if $form.f.owners.errors}{$form.f.owners.fieldErrors}{/if}
|
{if $form.f.owners.errors}{$form.f.owners.fieldErrors}{/if}
|
||||||
{$form.f.owners|unsafe}<br />
|
{$form.f.owners|unsafe}<br />
|
||||||
<span class="helptext">{trans 'Provide at least one owner for the project.'}</span>
|
<span class="helptext">{trans 'Provide at least one owner for the project or use a template.'}</span>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr class="no-template">
|
||||||
<th>{$form.f.members.labelTag}:</th>
|
<th>{$form.f.members.labelTag}:</th>
|
||||||
<td>
|
<td>
|
||||||
{if $form.f.members.errors}{$form.f.members.fieldErrors}{/if}
|
{if $form.f.members.errors}{$form.f.members.fieldErrors}{/if}
|
||||||
{$form.f.members|unsafe}
|
{$form.f.members|unsafe}
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
<tr>
|
<tr class="no-template">
|
||||||
<th>{if $form.f.private_project.errors}{$form.f.private_project.fieldErrors}{/if}
|
<th>{if $form.f.private_project.errors}{$form.f.private_project.fieldErrors}{/if}
|
||||||
{$form.f.private_project|unsafe}
|
{$form.f.private_project|unsafe}
|
||||||
</th>
|
</th>
|
||||||
@ -119,18 +126,19 @@ $(document).ready(function() {
|
|||||||
$(".svn-form").hide();
|
$(".svn-form").hide();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
// Hide if not svn
|
||||||
|
if ($("#id_template option:selected").val() == "--") {
|
||||||
|
$(".no-template").show();
|
||||||
|
} else {
|
||||||
|
$(".no-template").hide();
|
||||||
|
}
|
||||||
|
$("#id_template").change(function () {
|
||||||
|
if ($("#id_template option:selected").val() == "--") {
|
||||||
|
$(".no-template").show();
|
||||||
|
} else {
|
||||||
|
$(".no-template").hide();
|
||||||
|
}
|
||||||
|
});
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{/literal}{/block}
|
{/literal}{/block}
|
||||||
{*
|
|
||||||
|
|
||||||
$("select").change(function () {
|
|
||||||
var str = "";
|
|
||||||
$("select option:selected").each(function () {
|
|
||||||
str += $(this).text() + " ";
|
|
||||||
});
|
|
||||||
$("div").text(str);
|
|
||||||
})
|
|
||||||
.trigger('change');
|
|
||||||
|
|
||||||
*}
|
|
||||||
|
Loading…
Reference in New Issue
Block a user