From 64c66747626f8ea7fd3afbb5e33e623e2bde3f1e Mon Sep 17 00:00:00 2001 From: Thomas Keller Date: Mon, 21 May 2012 23:33:38 +0200 Subject: [PATCH] Copy over all project properties, except a few scm settings and very project-specific ones, when a new project is based on another one. --- NEWS.mdtext | 5 +++ src/IDF/Conf.php | 16 ++++++-- src/IDF/Form/Admin/ProjectCreate.php | 58 ++++++++++++---------------- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/NEWS.mdtext b/NEWS.mdtext index b5f3900..a55e25f 100644 --- a/NEWS.mdtext +++ b/NEWS.mdtext @@ -20,6 +20,11 @@ or newer to run properly! foreign key relation. Adding project tags was not possible for a similar reason. This has been fixed (issue 800, continued). +- If a project was created based on the settings of an existing project, + not all settings, like for example the new notification settings, have + been copied. This has been changed insofar that now all properties except + the project's URL, logo and individual SCM settings are copied by default. + # InDefero 1.3.2 - Wed May 09 20:05 2012 UTC ## Bugfixes diff --git a/src/IDF/Conf.php b/src/IDF/Conf.php index 568d484..90ad871 100644 --- a/src/IDF/Conf.php +++ b/src/IDF/Conf.php @@ -44,9 +44,9 @@ class IDF_Conf extends Pluf_Model array( 'type' => 'Pluf_DB_Field_Sequence', //It is automatically added. - 'blank' => true, + 'blank' => true, ), - 'project' => + 'project' => array( 'type' => 'Pluf_DB_Field_Foreignkey', 'model' => 'IDF_Project', @@ -84,7 +84,7 @@ class IDF_Conf extends Pluf_Model function initCache() { - $this->datacache = new ArrayObject(); + $this->datacache = array(); $sql = new Pluf_SQL('project=%s', $this->_project->id); foreach ($this->getList(array('filter' => $sql->gen())) as $val) { $this->datacache[$val->vkey] = $val->vdesc; @@ -97,7 +97,7 @@ class IDF_Conf extends Pluf_Model */ function setVal($key, $value) { - if (!is_null($this->getVal($key, null)) + if (!is_null($this->getVal($key, null)) and $value == $this->getVal($key)) { return; } @@ -129,4 +129,12 @@ class IDF_Conf extends Pluf_Model $this->initCache(); } } + + function getKeys() + { + if ($this->datacache === null) { + $this->initCache(); + } + return array_keys($this->datacache); + } } diff --git a/src/IDF/Form/Admin/ProjectCreate.php b/src/IDF/Form/Admin/ProjectCreate.php index afe31b4..69973a0 100644 --- a/src/IDF/Form/Admin/ProjectCreate.php +++ b/src/IDF/Form/Admin/ProjectCreate.php @@ -360,45 +360,35 @@ class IDF_Form_Admin_ProjectCreate extends Pluf_Form $conf = new IDF_Conf(); $conf->setProject($project); - $keys = array('scm', 'svn_remote_url', 'svn_username', - 'svn_password', 'mtn_master_branch', 'external_project_url'); - foreach ($keys as $key) { - $this->cleaned_data[$key] = (!empty($this->cleaned_data[$key])) ? - $this->cleaned_data[$key] : ''; - $conf->setVal($key, $this->cleaned_data[$key]); - } + if ($this->cleaned_data['template'] != '--') { $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' => IDF_Form_UploadConf::init_predefined, - 'labels_download_one_max' => IDF_Form_UploadConf::init_one_max, - 'labels_wiki_predefined' => IDF_Form_WikiConf::init_predefined, - 'labels_wiki_one_max' => IDF_Form_WikiConf::init_one_max, - 'labels_issue_template' => IDF_Form_IssueTrackingConf::init_template, - 'labels_issue_open' => IDF_Form_IssueTrackingConf::init_open, - 'labels_issue_closed' => IDF_Form_IssueTrackingConf::init_closed, - 'labels_issue_predefined' => IDF_Form_IssueTrackingConf::init_predefined, - 'labels_issue_one_max' => IDF_Form_IssueTrackingConf::init_one_max, - 'issue_relations' => IDF_Form_IssueTrackingConf::init_relations, - 'webhook_url' => '', - 'downloads_access_rights' => 'all', - 'review_access_rights' => 'all', - 'wiki_access_rights' => 'all', - 'source_access_rights' => 'all', - 'issues_access_rights' => 'all', - 'downloads_notification_email' => '', - 'review_notification_email' => '', - 'wiki_notification_email' => '', - 'source_notification_email' => '', - 'issues_notification_email' => '', - ); - foreach ($props as $prop => $def) { - $conf->setVal($prop, $tmplconf->getVal($prop, $def)); + + $allKeys = $tmplconf->getKeys(); + $scm = $this->cleaned_data['scm']; + $ignoreKeys = array('scm', 'external_project_url', 'logo'); + + // copy over all existing variables, except scm-related data and + // the project url / logo + foreach ($allKeys as $key) { + if (in_array($key, $ignoreKeys) || strpos($key, $scm.'_') === 0) { + continue; + } + $conf->setVal($key, $tmplconf->getVal($key)); } } + + $keys = array( + 'scm', 'svn_remote_url', 'svn_username', + 'svn_password', 'mtn_master_branch', + 'external_project_url' + ); + foreach ($keys as $key) { + $this->cleaned_data[$key] = !empty($this->cleaned_data[$key]) ? + $this->cleaned_data[$key] : ''; + $conf->setVal($key, $this->cleaned_data[$key]); + } $project->created(); if ($this->cleaned_data['template'] == '--') {