[Fusionforge-commits] FusionForge branch master updated. 6.0.4-445-ga1b9233

Franck Villaume nerville at libremir.placard.fr.eu.org
Wed May 18 13:33:16 CEST 2016


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "FusionForge".

The branch, master has been updated
       via  a1b92334f7384386aee78e53b197331edf217901 (commit)
      from  c062b5f4e0f846f7dc8dd7dac04fecdf662e01be (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
https://scm.fusionforge.org/anonscm/gitweb/?p=fusionforge/fusionforge.git;a=commitdiff;h=a1b92334f7384386aee78e53b197331edf217901

commit a1b92334f7384386aee78e53b197331edf217901
Author: Stéphane-Eymeric Bredthauer <sebredthauer at gmail.com>
Date:   Wed May 18 13:00:29 2016 +0200

    Tracker workflow: add support of required fields

diff --git a/src/common/tracker/Artifact.class.php b/src/common/tracker/Artifact.class.php
index 581cbcf..a489b0a 100644
--- a/src/common/tracker/Artifact.class.php
+++ b/src/common/tracker/Artifact.class.php
@@ -1264,6 +1264,8 @@ class Artifact extends FFError {
 			return true;
 		}
 
+		$status_changed = false;
+
 		// If there is a status field, then check against the workflow.
 		// Unless if we change type.
 		if (! isset($changes['Type']) || !$changes['Type']) {
@@ -1276,11 +1278,13 @@ class Artifact extends FFError {
 							WHERE artifact_id=$1 AND extra_field_id=$2',
 						array($this->getID(),
 							$efid));
-					$old = (db_numrows($res)>0) ? db_result($res,0,'field_data') : 100;
-					if ($old != $extra_fields[$efid]) {
+					$from_status = (db_numrows($res)>0) ? db_result($res,0,'field_data') : 100;
+					$to_status = $extra_fields[$efid];
+						if ($from_status != $to_status) {
+						$status_changed = true;
 						$atw = new ArtifactWorkflow($this->ArtifactType, $efid);
-						if (!$atw->checkEvent($old, $extra_fields[$efid])) {
-							$this->setError('Workflow error: You are not authorized to change the Status ('.$old.' => '.$extra_fields[$efid].')');
+						if (!$atw->checkEvent($from_status, $to_status)) {
+							$this->setError('Workflow error: You are not authorized to change the Status ('.$from_status.' => '.$to_status.')');
 							return false;
 						}
 					}
@@ -1288,13 +1292,21 @@ class Artifact extends FFError {
 			}
 		}
 
+		if ($status_changed) {
+			$CSFid = $this->ArtifactType->getCustomStatusField();
+			$wf = new ArtifactWorkflow($this->ArtifactType, $CSFid);
+			$rf = $wf->getRequiredFields($from_status, $to_status);
+		} else {
+			$rf = array();
+		}
+
 		//now we'll update this artifact for each extra field
 		for ($i=0; $i<count($efk); $i++) {
 			$efid=$efk[$i];
 			$type=$ef[$efid]['field_type'];
 
 			// check required fields
-			if ($ef[$efid]['is_required']) {
+			if ($ef[$efid]['is_required'] || in_array($efid, $rf)) {
 				if (!array_key_exists($efid, $extra_fields)) {
 					if ($type == ARTIFACT_EXTRAFIELDTYPE_STATUS) {
 						$this->setError(_('Status Custom Field Must Be Set'));
diff --git a/src/common/tracker/ArtifactExtraField.class.php b/src/common/tracker/ArtifactExtraField.class.php
index 1c31a43..54bfa02 100644
--- a/src/common/tracker/ArtifactExtraField.class.php
+++ b/src/common/tracker/ArtifactExtraField.class.php
@@ -39,6 +39,8 @@ define('ARTIFACT_EXTRAFIELDTYPE_INTEGER',10);
 define('ARTIFACT_EXTRAFIELDTYPE_FORMULA',11);
 /* reserved for Evolvis extension, for merge into FusionForge */
 define('ARTIFACT_EXTRAFIELDTYPE_DATETIME',12);
+/* reserved */
+define('ARTIFACT_EXTRAFIELDTYPE_USER',13);
 
 class ArtifactExtraField extends FFError {
 
diff --git a/src/common/tracker/ArtifactType.class.php b/src/common/tracker/ArtifactType.class.php
index c053148..5b10f5c 100644
--- a/src/common/tracker/ArtifactType.class.php
+++ b/src/common/tracker/ArtifactType.class.php
@@ -283,6 +283,7 @@ class ArtifactType extends FFError {
 	 */
 	function fetchData($artifact_type_id) {
 		$this->voters = false;
+		$this->extra_field = false;
 		$res = db_query_params('SELECT * FROM artifact_group_list_vw
 			WHERE group_artifact_id=$1
 			AND group_id=$2',
diff --git a/src/common/tracker/ArtifactWorkflow.class.php b/src/common/tracker/ArtifactWorkflow.class.php
index ccf98b2..ad794d9 100644
--- a/src/common/tracker/ArtifactWorkflow.class.php
+++ b/src/common/tracker/ArtifactWorkflow.class.php
@@ -190,8 +190,45 @@ class ArtifactWorkflow extends FFError {
 		return true;
 	}
 
-	function _getEventId($from, $to) {
+	function getRequiredFields($from, $to) {
+		$res = db_query_params ('SELECT extra_field_id
+				FROM artifact_workflow_required_fields NATURAL INNER JOIN artifact_workflow_event
+				WHERE group_artifact_id=$1
+				AND field_id=$2
+				AND from_value_id=$3
+				AND to_value_id=$4',
+				array($this->artifact_id,
+						$this->field_id,
+						$from,
+						$to));
+		$values = array();
+		while($arr = db_fetch_array($res)) {
+			$values[] = $arr['extra_field_id'];
+		}
+		return $values;
+	}
+
+	function saveRequiredFields($from, $to, $extra_fields) {
+		$event_id = $this->_getEventId($from, $to);
+		// Get required fields.
+		$current = $this->getRequiredFields($from, $to);
+		// Remove required fields no longer present.
+		foreach ($current as $extra_field) {
+			if (!in_array($extra_field, $extra_fields)) {
+				$this->_removeRequiredField($event_id, $extra_field);
+			}
+		}
+
+		// Add missing required fields.
+		foreach ($extra_fields as $extra_field) {
+			if (!in_array($extra_field, $current)) {
+				$this->_addRequiredField($event_id, $extra_field);
+			}
+		}
+		return true;
+	}
 
+	function _getEventId($from, $to) {
 		$res = db_query_params ('SELECT event_id FROM artifact_workflow_event
 				WHERE group_artifact_id=$1
 				AND field_id=$2
@@ -250,7 +287,6 @@ class ArtifactWorkflow extends FFError {
 			$this->setError('Unable to remove Event($from, $to): '.db_error());
 			return false;
 		}
-
 		return true;
 	}
 
@@ -296,11 +332,35 @@ class ArtifactWorkflow extends FFError {
 			array($event_id,
 				$role_id));
 		if (!$res) {
-			$this->setError('Unable to remove Event($from, $to): '.db_error());
+			$this->setError('Unable to remove Role ($role_id): '.db_error());
 			return false;
 		}
 		return true;
+	}
 
+	function _addRequiredField($event_id, $extra_field_id) {
+		$res = db_query_params ('INSERT INTO artifact_workflow_required_fields
+				(event_id, extra_field_id)
+				VALUES ($1, $2)',
+				array($event_id,
+						$extra_field_id));
+		if (!$res) {
+			$this->setError('Unable to add Extra Field ($extra_field_id): '.db_error());
+			return false;
+		}
+		return true;
+	}
+
+	function _removeRequiredField($event_id, $extra_field_id) {
+		$res = db_query_params ('DELETE FROM artifact_workflow_required_fields
+				WHERE event_id=$1 AND extra_field_id=$2',
+				array($event_id,
+						$extra_field_id));
+		if (!$res) {
+			$this->setError('Unable to remove Extra Field ($extra_field_id): '.db_error());
+			return false;
+		}
+		return true;
 	}
 
 }
diff --git a/src/common/tracker/actions/admin-updates.php b/src/common/tracker/actions/admin-updates.php
index 0e9c1da..99f84e8 100644
--- a/src/common/tracker/actions/admin-updates.php
+++ b/src/common/tracker/actions/admin-updates.php
@@ -560,8 +560,8 @@ if (getStringFromRequest('add_extrafield')) {
 	$elearray = $ath->getExtraFieldElements($field_id);
 	foreach ($elearray as $e) {
 		$from = $e['element_id'];
-		$next = isset($wk[$from]) ? array_keys($wk[$from]) : array();
-		$atw->saveNextNodes($from, $next);
+		$to = isset($wk[$from]) ? array_keys($wk[$from]) : array();
+		$atw->saveNextNodes($from, $to);
 	}
 	$feedback .= _('Workflow saved');
 
@@ -569,11 +569,23 @@ if (getStringFromRequest('add_extrafield')) {
 	require_once $gfcommon.'tracker/ArtifactWorkflow.class.php';
 	$field_id = getIntFromRequest('field_id');
 	$from = getIntFromRequest('from');
-	$next = getIntFromRequest('next');
+	$to = getIntFromRequest('next');
 	$role = array_keys(getArrayFromRequest('role'));
 	$atw = new ArtifactWorkflow($ath, $field_id);
-	$atw->saveAllowedRoles($from, $next, $role);
-	$feedback .= _('Workflow saved');
+	$atw->saveAllowedRoles($from, $to, $role);
+	$feedback .= _('Workflow (allowed roles) saved');
+	$next = 'workflow';
+
+} elseif (getStringFromRequest('workflow_required_fields')) {
+	require_once $gfcommon.'tracker/ArtifactWorkflow.class.php';
+	$field_id = getIntFromRequest('field_id');
+	$from = getIntFromRequest('from');
+	$to = getIntFromRequest('next');
+	$extra_field = array_keys(getArrayFromRequest('extrafield'));
+	$atw = new ArtifactWorkflow($ath, $field_id);
+	$atw->saveRequiredFields($from, $to, $extra_field);
+	$feedback .= _('Workflow (required fields) saved');
+	$next = 'workflow';
 
 } elseif (getStringFromRequest('delete_opt')) {
 	$sure = getStringFromRequest('sure');
diff --git a/src/common/tracker/views/form-workflow.php b/src/common/tracker/views/form-workflow.php
index 21d487e..db32b0b 100644
--- a/src/common/tracker/views/form-workflow.php
+++ b/src/common/tracker/views/form-workflow.php
@@ -117,12 +117,16 @@ echo $HTML->openForm(array('action' => '/tracker/admin/?group_id='.$group_id.'&a
 				if ($value) {
 					$url = '/tracker/admin/?group_id='.$group_id.'&atid='.$ath->getID().'&workflow_roles=1&from='.$status['element_id'].'&next='.$s['element_id'];
 					$str .= util_make_link($url, html_image('ic/acl_roles20.png', 20, 20, array('alt'=>_('Edit Roles'))), array('title' => _('Edit roles')));
+					$url = '/tracker/admin/?group_id='.$group_id.'&atid='.$ath->getID().'&workflow_required_fields=1&from='.$status['element_id'].'&next='.$s['element_id'];
+					$str .= util_make_link($url, html_image('ic/required.png', 20, 20, array('alt'=>_('Edit Required Fields'))), array('title' => _('Edit required fields')));
 				} else {
 					$str .= ' '.html_image('spacer.gif', 20, 20);
+					$str .= ' '.html_image('spacer.gif', 20, 20);
 				}
 			} else {
 				$str = '<input type="checkbox" checked="checked" disabled="disabled" />';
 				$str .= ' '.html_image('spacer.gif', 20, 20);
+				$str .= ' '.html_image('spacer.gif', 20, 20);
 			}
 			echo '<td class="align-center">'.$str.'</td>'."\n";
 		}
@@ -132,6 +136,8 @@ echo $HTML->openForm(array('action' => '/tracker/admin/?group_id='.$group_id.'&a
 
 ?>
 <div class="tips">Tip: Click on <?php echo html_image('ic/acl_roles20.png', 20, 20, array('alt'=> _('Edit Roles'))) ?> to configure allowed roles for a transition (all by default).</div>
+<div class="tips">Tip2: Click on <?php echo html_image('ic/required.png', 20, 20, array('alt'=> _('Edit Required Fields'))) ?> to configure required fields for a transition (none by default).</div>
+
 <p>
 <input type="submit" name="post_changes" value="<?php echo _('Submit') ?>" /></p>
 <?php
diff --git a/src/common/tracker/views/form-workflow_roles.php b/src/common/tracker/views/form-workflow_required_fields.php
similarity index 67%
copy from src/common/tracker/views/form-workflow_roles.php
copy to src/common/tracker/views/form-workflow_required_fields.php
index 175a4bc..6b9ec52 100644
--- a/src/common/tracker/views/form-workflow_roles.php
+++ b/src/common/tracker/views/form-workflow_required_fields.php
@@ -1,10 +1,11 @@
 <?php
 /**
- * Workflow Form
+ * Workflow Required Files Form
  *
  * Copyright 2010, FusionForge Team
  * Copyright (C) 2011 Alain Peyrat - Alcatel-Lucent
  * Copyright 2015, Franck Villaume - TrivialDev
+ * Copyright 2016, Stéphane-Eymeric Bredthauer - TrivialDev
  * http://fusionforge.org
  *
  * This file is part of FusionForge. FusionForge is free software;
@@ -23,6 +24,8 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+// based on form-workflow_roles.php
+
 require_once 'common/tracker/ArtifactWorkflow.class.php';
 
 global $HTML;
@@ -48,33 +51,40 @@ global $HTML;
 		$field_id = $keys[0];
 
 		$atw = new ArtifactWorkflow($ath, $field_id);
-		$roles = $atw->getAllowedRoles($from, $next);
+		$requiredFields = $atw->getRequiredFields($from, $next);
 
 		$elearray = $ath->getExtraFieldElements($field_id);
 		foreach ($elearray as $e) {
 			$name[ $e['element_id'] ] = $e['element_name'];
 		}
 
-		$title = sprintf(_('Configuring allowed roles for the transitions from %1$s to %2$s'), $name[$from], $name[$next]);
+		$title = sprintf(_('Configuring required files for the transitions from %1$s to %2$s'), $name[$from], $name[$next]);
 		$ath->adminHeader(array('title'=>$title,
 			'pagename'=>'tracker_admin_customize_liste',
 			'titlevals'=>array($ath->getName())));
 
-echo $HTML->openForm(array('action' => '/tracler/admin/?group_id='.$group_id.'&atid='.$ath->getID(), 'method' => 'post'));
+echo $HTML->openForm(array('action' => '/tracker/admin/?group_id='.$group_id.'&atid='.$ath->getID(), 'method' => 'post'));
 ?>
 		<input type="hidden" name="field_id" value="<?php echo $field_id ?>" />
-		<input type="hidden" name="workflow_roles" value="1" />
+		<input type="hidden" name="workflow_required_fields" value="1" />
 		<input type="hidden" name="from" value="<?php echo $from ?>" />
 		<input type="hidden" name="next" value="<?php echo $next ?>" />
 
 <?php
-		$group_roles = $group->getRoles() ;
-		sortRoleList ($group_roles) ;
-		foreach ($group_roles as $role) {
-			$value = in_array($role->getID(), $roles)? ' checked="checked"' : '';
-			$str = '<input type="checkbox" name="role['.$role->getID().']"'.$value.' />';
-			$str .= ' '.$role->getDisplayableName($group);
-			echo $str."<br />\n";
+		$extra_fields = $ath->getExtraFields() ;
+		//sortRoleList ($group_roles) ;
+		foreach ($extra_fields as $key => $row) {
+			$extra_fields_names[$key] = $row['field_name'];
+		}
+		array_multisort($extra_fields_names, SORT_ASC, SORT_LOCALE_STRING | SORT_FLAG_CASE, $extra_fields);
+		
+		foreach ($extra_fields as $field) {
+			if ($field['field_type'] != ARTIFACT_EXTRAFIELDTYPE_STATUS) {
+				$value = in_array($field['extra_field_id'], $requiredFields)? ' checked="checked"' : '';
+				$str = '<input type="checkbox" name="extrafield['.$field['extra_field_id'].']"'.$value.' />';
+				$str .= ' '.$field['field_name'];
+				echo $str."<br />\n";
+			}
 		}
 ?>
 		<p>
diff --git a/src/common/tracker/views/form-workflow_roles.php b/src/common/tracker/views/form-workflow_roles.php
index 175a4bc..b1f4600 100644
--- a/src/common/tracker/views/form-workflow_roles.php
+++ b/src/common/tracker/views/form-workflow_roles.php
@@ -60,7 +60,7 @@ global $HTML;
 			'pagename'=>'tracker_admin_customize_liste',
 			'titlevals'=>array($ath->getName())));
 
-echo $HTML->openForm(array('action' => '/tracler/admin/?group_id='.$group_id.'&atid='.$ath->getID(), 'method' => 'post'));
+echo $HTML->openForm(array('action' => '/tracker/admin/?group_id='.$group_id.'&atid='.$ath->getID(), 'method' => 'post'));
 ?>
 		<input type="hidden" name="field_id" value="<?php echo $field_id ?>" />
 		<input type="hidden" name="workflow_roles" value="1" />
diff --git a/src/www/themes/funky/images/ic/required.png b/src/www/themes/funky/images/ic/required.png
new file mode 100644
index 0000000..600811b
Binary files /dev/null and b/src/www/themes/funky/images/ic/required.png differ
diff --git a/src/www/tracker/admin/index.php b/src/www/tracker/admin/index.php
index 73ce5d3..144f90a 100644
--- a/src/www/tracker/admin/index.php
+++ b/src/www/tracker/admin/index.php
@@ -118,7 +118,7 @@ if ($group_id && $atid) {
 	if ($next) {
 		$action = $next;
 	} else {
-		$actions = array('add_extrafield', 'customize_list', 'workflow', 'workflow_roles', 'add_opt',
+		$actions = array('add_extrafield', 'customize_list', 'workflow', 'workflow_roles', 'workflow_required_fields', 'add_opt',
 			'updownorder_opt', 'post_changes_order', 'post_changes_alphaorder', 'copy_opt', 'add_canned',
 			'clone_tracker', 'edittemplate',
 			'update_canned', 'delete_canned', 'update_box', 'update_opt', 'delete', 'delete_opt', 'deleteextrafield','update_type');
@@ -147,6 +147,10 @@ if ($group_id && $atid) {
 
 		include $gfcommon.'tracker/views/form-workflow_roles.php';
 
+	} elseif ($action == 'workflow_required_fields') {
+
+		include $gfcommon.'tracker/views/form-workflow_required_fields.php';
+
 	} elseif ($action == 'add_opt' ||
 			  $action == 'updownorder_opt' ||
 			  $action == 'post_changes_order' ||

-----------------------------------------------------------------------

Summary of changes:
 src/common/tracker/Artifact.class.php              |  22 +++++--
 src/common/tracker/ArtifactExtraField.class.php    |   2 +
 src/common/tracker/ArtifactType.class.php          |   1 +
 src/common/tracker/ArtifactWorkflow.class.php      |  66 ++++++++++++++++++++-
 src/common/tracker/actions/admin-updates.php       |  22 +++++--
 src/common/tracker/views/form-workflow.php         |   6 ++
 ...roles.php => form-workflow_required_fields.php} |  34 +++++++----
 src/common/tracker/views/form-workflow_roles.php   |   2 +-
 src/www/themes/funky/images/ic/required.png        | Bin 0 -> 1656 bytes
 src/www/tracker/admin/index.php                    |   6 +-
 10 files changed, 134 insertions(+), 27 deletions(-)
 copy src/common/tracker/views/{form-workflow_roles.php => form-workflow_required_fields.php} (67%)
 create mode 100644 src/www/themes/funky/images/ic/required.png


hooks/post-receive
-- 
FusionForge



More information about the Fusionforge-commits mailing list