Commit 8f431fdf authored by Jean-Paul Saman's avatar Jean-Paul Saman

Configuration and upgrade.

parent 620d5a39
...@@ -2,14 +2,14 @@ ...@@ -2,14 +2,14 @@
/* /*
* Name: Timesheet * Name: Timesheet
* Directory: timesheet * Directory: timesheet
* Version: 1.0.3 * Version: 2.0.
* Type: user * Type: user
* UI Name: Timesheet * UI Name: Timesheet
* UI Icon: timesheet.png * UI Icon: timesheet.png
*/ */
/* /*
* Copyright (C) 2007, M2X * Copyright (C) 2007-2014, M2X BV
* *
* Authors: Jean-Paul Saman * Authors: Jean-Paul Saman
* *
...@@ -30,19 +30,68 @@ ...@@ -30,19 +30,68 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
*****************************************************************************/ *****************************************************************************/
// Deny all but system admins if (!defined('W2P_BASE_DIR')) {
if (getDenyEdit('system')) { die('You should not access this file directly.');
$AppUI->redirect( "m=public&a=access_denied" );
} }
@include_once( "./functions/admin_func.php" ); // deny all but system admins
$canEdit = canEdit('system');
$CONFIG_FILE = "./modules/timesheet/config.php"; if (!$canEdit) {
$AppUI->redirect(ACCESS_DENIED);
}
$AppUI->savePlace(); $AppUI->savePlace();
// Pull all users // TODO Remove queries from this file
$q = new DBQuery(); $config = array();
$q = new w2p_Database_Query;
if (isset($_POST['forcesubmit']) && isset($_POST['submit'])) {
$q->addTable('timesheet_config');
$q->addUpdate('timesheet_config', 'timesheet_approval_by');
$q->addUpdate('timesheet_value', $_POST['timesheet_approval_by']);
$q->addWhere('timesheet_config = "timesheet_approval_by"');
if (!$q->exec()) {
$AppUI->setMsg(db_error(), UI_MSG_ERROR);
}
$q->clear();
$q->addTable('timesheet_config');
$q->addUpdate('timesheet_config', 'timesheet_book_year');
$q->addUpdate('timesheet_value', $_POST['timesheet_book_year']);
$q->addWhere('timesheet_config = "timesheet_book_year"');
if (!$q->exec()) {
$AppUI->setMsg(db_error(), UI_MSG_ERROR);
}
$q->clear();
$q->addTable('timesheet_config');
$q->addUpdate('timesheet_config', 'timesheet_sort_order');
$q->addUpdate('timesheet_value', $_POST['timesheet_sort_order']);
$q->addWhere('timesheet_config = "timesheet_sort_order"');
if (!$q->exec()) {
$AppUI->setMsg(db_error(), UI_MSG_ERROR);
} else {
$AppUI->setMsg('Timesheet configuration saved', UI_MSG_OK);
}
$q->clear();
$AppUI->redirect('m=timesheet&a=configure');
}
else {
// Read values from table
$q->addQuery('*');
$q->addTable('timesheet_config');
if (!$q->exec()) {
$AppUI->setMsg(db_error(), UI_MSG_ERROR);
} else {
$AppUI->setMsg('Timesheet configuration read', UI_MSG_OK);
}
while ($row = $q->fetchRow()) {
$config[$row['timesheet_config']] = $row['timesheet_value'];
}
$q->clear();
}
// Get list of all users
$q->addQuery('user_id, contact_first_name, contact_last_name'); $q->addQuery('user_id, contact_first_name, contact_last_name');
$q->addTable('users'); $q->addTable('users');
$q->addTable('contacts'); $q->addTable('contacts');
...@@ -53,152 +102,70 @@ $users = array(); ...@@ -53,152 +102,70 @@ $users = array();
while ( $row = $q->fetchRow()) { while ( $row = $q->fetchRow()) {
$users[$row['user_id']] = $row['contact_last_name'] . ', ' . $row['contact_first_name']; $users[$row['user_id']] = $row['contact_last_name'] . ', ' . $row['contact_first_name'];
} }
$q->clear();
/* Sort order */ /* Sort order */
$order = array(); $order = array();
$order[0] = "Ascending"; $order[0] = "Ascending";
$order[1] = "Descending"; $order[1] = "Descending";
/* All config options, their descriptions and their default values are defined
* here. Add new config options here. Type can be "checkbox", "text", "radio" or
* "select". If the type is "radio," it must include a set of buttons. If it's
* "select" then be sure to include a 'list' entry with the options. if the key
* starts with headingXXX then it will just display the contents on the value.
* This is used for grouping.
*/
$config_options = array(
"heading1" => $AppUI->_('Timesheet rights'),
"approval_by" => array(
"description" => $AppUI->_('Approval by'),
"value" => '',
'type' => 'select',
'list' => $users
),
"book_year" => array(
"description" => $AppUI->_('Book year'),
"value" => '',
"type" => 'text'
),
"sort_order" => array(
"description" => $AppUI->_('Sort order'),
"value" => '',
'type' => 'select',
'list' => $order
)
);
//if this is a submitted page, overwrite the config file.
if(dPgetParam( $_POST, "Save", '' )!='')
{
if (is_writable($CONFIG_FILE)) {
if (!$handle = fopen($CONFIG_FILE, 'w')) {
$AppUI->setMsg( $CONFIG_FILE." ".$AppUI->_('cannot be opened'), UI_MSG_ERROR );
exit;
}
if (fwrite($handle, "<?php //Do not edit this file by hand, it will be overwritten by the configuration utility. \n") === FALSE) {
$AppUI->setMsg( $CONFIG_FILE." ".$AppUI->_('cannot be written to'), UI_MSG_ERROR );
exit;
} else {
foreach ($config_options as $key=>$value){
if(substr($key,0,7)=='heading') continue;
$val="";
switch($value['type']){
case 'checkbox':
$val = isset($_POST[$key])?"1":"0";
break;
case 'text':
$val = isset($_POST[$key])?$_POST[$key]:"";
break;
case 'select':
$val = isset($_POST[$key])?$_POST[$key]:"0";
break;
case 'radio':
$val = $_POST[$key];
break;
default:
break;
}
fwrite($handle, "\$TIMESHEET_CONFIG['".$key."'] = '".$val."';\n");
}
fwrite($handle, "?>\n");
$AppUI->setMsg( $CONFIG_FILE." ".$AppUI->_('has been successfully updated'), UI_MSG_OK );
fclose($handle);
require( $CONFIG_FILE );
}
} else {
$AppUI->setMsg( $CONFIG_FILE." ".$AppUI->_('is not writable'), UI_MSG_ERROR );
}
} else if(dPgetParam( $_POST, $AppUI->_('cancel'), '' )!=''){
$AppUI->redirect("m=system&a=viewmods");
}
//$TIMESHEET_CONFIG = array();
require_once( $CONFIG_FILE );
//Read the current config values from the config file and update the array.
foreach ($config_options as $key=>$value){
if(isset($TIMESHEET_CONFIG[$key])){
$config_options[$key]['value']=$TIMESHEET_CONFIG[$key];
}
}
// setup the title block // setup the title block
$titleBlock = new CTitleBlock( 'Configure Timesheet Module', 'timesheet.png', $m, "$m.$a" ); $titleBlock = new w2p_Theme_TitleBlock( 'Configure Timesheet Module', 'timesheet.png', $m, '$m' . '.' . '$a' );
$titleBlock->addCrumb( "?m=system", "System Admin" ); $titleBlock->addCrumb( "?m=system", "system admin" );
$titleBlock->addCrumb( "?m=system&a=viewmods", "Modules" ); $titleBlock->addCrumb( "?m=system&a=viewmods", "modules list" );
$titleBlock->show(); $titleBlock->show();
?> ?>
<script language="javascript" type="text/javascript">
function submitFrm( frmName ) {
eval('document.'+frmName+'.submit();');
}
</script>
<form method="post"> <form name="frmTimesheetConfig" method="post" accept-charset="utf-8">
<input type="hidden" name="forcesubmit" value="true" />
<table class="std"> <table class="std">
<?php <tr><td>Book Year</td>
foreach ($config_options as $key=>$value){ <td>
?> <?php
<tr> print "<input type=\"text\" name=\"timesheet_book_year\" id=\"book_year\" value=\"" . $config['timesheet_book_year'] . "\" pattern=\"^\s*\d{4}\" size=4 required />";
<?php ?>
// the key starts with hr, then just display the value </td>
if(substr($key,0,7)=='heading'){ ?> </tr>
<th align="center" colspan="2"><?php echo $value?></th> <tr><td>Approval by</td>
<?php } else { ?> <td>
<td align="right"><?php echo $value['description']?></td> <select name="timesheet_approval_by" size="1" class="text">
<td><?php <?php
switch($value['type']){ foreach ( $users as $u => $n ) {
case 'checkbox': ?> $selected = '';
<input type="checkbox" name="<?php echo $key?>" <?php echo $value['value']?"checked=\"checked\"":""?>> if ($u == $config['timesheet_approval_by'])
<?php $selected = ' selected';
break; print "<option " . $u . $selected . " value=\"" . $u . "\">" . $users[$u] . "</option>";
case 'text': ?> print "\n";
<input type="text" name="<?php echo $key?>" value="<?php echo $value['value']?>">
<?php
break;
case 'select':
print arraySelect( $value["list"], $key, 'class="text" size="1" id="' . $key . '" ' . $value["events"], $value["value"] );
break;
case 'radio':
foreach ($value['buttons'] as $v => $n) {?>
<label><input type="radio" name="<?php echo $key; ?>" id="<?php echo $key; ?>" value=<?php echo $v; ?> <?php echo (($value['value'] == $v)?"checked":""); ?> <?php echo $value['events']; ?>> <?php echo $n;?></label>
<?php }
break;
default:
break;
} }
?></td> ?>
<?php </td>
} </tr>
?> <tr><td>Sort order</td>
</tr> <td>
<?php <select name="timesheet_sort_order" size="1" class="text">
} <?php
?> foreach ( $order as $o => $n ) {
<tr> $selected = '';
<td colspan="2" align="right"> if (strcasecmp($order[$o], $config['timesheet_sort_order']) == 0)
<input type="Submit" name="Cancel" value="<?php echo $AppUI->_('cancel')?>"> $selected = ' selected';
<input type="Submit" name="Save" value="<?php echo $AppUI->_('save')?>"> print "<option " . $o . $selected . " value=\"" . $order[$o] . "\">" . $order[$o] . "</option>";
</td> print "\n";
</tr> }
?>
</td>
</tr>
<tr><td align="left">
<input type="Submit" name="back" value="<?php echo $AppUI->_('back')?>">
</td>
<td align="right">
<input type="Submit" name="submit" value="<?php echo $AppUI->_('submit')?>">
</td>
</tr>
</table> </table>
</form> </form>
...@@ -2,14 +2,14 @@ ...@@ -2,14 +2,14 @@
/* /*
* Name: Timesheet * Name: Timesheet
* Directory: timesheet * Directory: timesheet
* Version: 1.0.2 * Version: 3.0.0
* Type: user * Type: user
* UI Name: Timesheet * UI Name: Timesheet
* UI Icon: * UI Icon:
*/ */
/* /*
* Copyright (C) 2007-2008, M2X * Copyright (C) 2007-2014, M2X BV
* *
* Authors: Jean-Paul Saman * Authors: Jean-Paul Saman
* *
...@@ -31,31 +31,40 @@ ...@@ -31,31 +31,40 @@
// MODULE CONFIGURATION DEFINITION // MODULE CONFIGURATION DEFINITION
$config = array(); $config = array();
$config['mod_name'] = 'Timesheet'; // name the module $config['mod_name'] = 'Timesheet'; // name the module
$config['mod_version'] = '2.0.3'; // add a version number $config['mod_version'] = '3.0.0'; // add a version number
$config['mod_directory'] = 'timesheet'; // tell dotProject where to find this module $config['mod_directory'] = 'timesheet'; // tell dotProject where to find this module
$config['mod_setup_class'] = 'CSetupTimesheet'; // the name of the PHP setup class (used below) $config['mod_setup_class'] = 'CSetupTimesheet'; // the name of the PHP setup class (used below)
$config['mod_type'] = 'user'; // 'core' for modules distributed with dP by standard, 'user' for additional modules from dotmods $config['mod_type'] = 'user'; // 'core' for modules distributed with dP by standard, 'user' for additional modules from dotmods
$config['mod_ui_name'] = 'Timesheet'; // the name that is shown in the main menu of the User Interface $config['mod_ui_name'] = $config['mod_name']; // the name that is shown in the main menu of the User Interface
$config['mod_ui_icon'] = 'communicate.gif'; // name of a related icon $config['mod_ui_icon'] = 'communicate.gif'; // name of a related icon
$config['mod_description'] = 'Timesheet module for hour registration'; // some description of the module $config['mod_description'] = 'Timesheet module for hour registration'; // some description of the module
$config['mod_config'] = true; // show 'configure' link in viewmods $config['mod_config'] = true; // show 'configure' link in viewmods
$config['mod_main_class'] = 'CTimesheet';// this is the table the system should check for permissions
// show module configuration with the dPframework (if requested via http) $config['permission_item_table'] = 'timesheet';
$config['permissions_item_field'] = 'timesheet_id';
$config['permissions_item_label'] = 'timesheet_period';
// show module configuration in 'System Administration|View Modules'
if (@$a == 'setup') { if (@$a == 'setup') {
echo dPshowModuleConfig( $config ); echo w2PshowModuleConfig($config);
} }
class CSetupTimesheet { $config['requirements'] = array(
array('require' => 'web2project', 'comparator' => '>=', 'version' => '3')
);
function configure() { class CSetupTimesheet extends w2p_Core_Setup
{
public function configure() {
// load module specific configuration page
global $AppUI; global $AppUI;
$AppUI->redirect( 'm=timesheet&a=configure' ); // load module specific configuration page $AppUI->redirect( 'm=timesheet&a=configure' );
return true; return true;
} }
function remove() { public function remove() {
$q = new DBQuery(); $q = new w2p_Database_Query();
$q->dropTable('timesheet'); $q->dropTable('timesheet');
$q->exec(); $q->exec();
...@@ -63,35 +72,83 @@ class CSetupTimesheet { ...@@ -63,35 +72,83 @@ class CSetupTimesheet {
$q->dropTable('timesheet_project'); $q->dropTable('timesheet_project');
$q->exec(); $q->exec();
return null; $q->clear();
} $q->dropTable('timesheet_config');
$q->exec();
function upgrade( $old_version ) { return parent::remove();
// use this to provide upgrade functionality between different versions; not relevant here }
switch ( $old_version ) public function upgrade($old_version) {
{ // use this to provide upgrade functionality between different versions
case "all": // upgrade from scratch (called from install)
case "0.9": $result = false;
//do some alter table commands switch ($old_version) {
case 'all': // upgrade from scratch (called from install)
case '0.9':
case '1.0':
case '1.0.1':
case '1.0.2':
case '2.0.0':
case '2.0.1':
case '2.0.2':
case '2.0.3':
$result = $this->_createConfigurationTable();
if (!$result) {
db_error();
return false;
}
$result = $this-> _insertConfigurationData();
if (!$result) {
db_error();
return false;
}
case '3.0.0':
default:
// do nothing
}
case "1.0": return $result;
case "1.0.1": }
case "1.0.2":
case "2.0.0":
case "2.0.1";
case "2.0.2":
return true;
default: public function install() {
$result = $this->_checkRequirements();
if (!$result) {
return false; return false;
} }
return false; // Timesheet table
$result = $this->createTimesheetTable();
if (!$result) {
db_error();
return false;
}
// Timesheet project table
$result = $this->_createProjectTable();
if (!$result) {
db_error();
return false;
}
// Timesheet configuration table
$result = $this->_createConfigurationTable();
if (!$result) {
db_error();
return false;
}
$result = $this-> _insertConfigurationData();
if (!$result) {
db_error();
return false;
}
return parent::install();
} }
function install() { private function _createTimesheetTable() {
// prepare the creation of a dbTable $q = new w2p_Database_Query();
$sql = "( " . $sql = "( " .
" `timesheet_id` int(11) unsigned NOT NULL auto_increment," . " `timesheet_id` int(11) unsigned NOT NULL auto_increment," .
" `timesheet_period` int(11) NOT NULL default '0', " . " `timesheet_period` int(11) NOT NULL default '0', " .
...@@ -101,27 +158,53 @@ class CSetupTimesheet { ...@@ -101,27 +158,53 @@ class CSetupTimesheet {
" `timesheet_worked` int(11) NOT NULL default '0', " . " `timesheet_worked` int(11) NOT NULL default '0', " .
" PRIMARY KEY (`timesheet_id`), " . " PRIMARY KEY (`timesheet_id`), " .
" UNIQUE KEY `timesheet_id` (`timesheet_id`) " . " UNIQUE KEY `timesheet_id` (`timesheet_id`) " .
") TYPE=MyISAM"; ") ENGINE = MYISAM DEFAULT CHARSET=utf8";
$q = new DBQuery;
$q->createTable('timesheet'); $q->createTable('timesheet');
$q->createDefinition($sql); $q->createDefinition($sql);
if (!$q->exec()) { $result = $q->exec();
db_error(); return $result;
} }
private function _createProjectTable() {
$q = new w2p_Database_Query();
$sql = "( " . $sql = "( " .
" `timesheet_queue_id` int(11) NOT NULL auto_increment, " . " `timesheet_queue_id` int(11) NOT NULL auto_increment, " .
" `timesheet_id` int(11) unsigned NOT NULL, " . " `timesheet_id` int(11) unsigned NOT NULL, " .
" `timesheet_project` int(11) NOT NULL default '0', " . " `timesheet_project` int(11) NOT NULL default '0', " .
" `timesheet_project_amount` bigint(20) NOT NULL default '0', " . " `timesheet_project_amount` bigint(20) NOT NULL default '0', " .
" PRIMARY KEY (`timesheet_queue_id`) " . " PRIMARY KEY (`timesheet_queue_id`) " .
") TYPE=MyISAM"; ") ENGINE = MYISAM DEFAULT CHARSET=utf8";
$q->clear(); $q->clear();
$q->createTable('timesheet_project'); $q->createTable('timesheet_project');
$q->createDefinition($sql); $q->createDefinition($sql);
if (!$q->exec()) { $result = $q->exec();
db_error(); return $result;
} }
return null;
private function _createConfigurationTable() {
$q = new w2p_Database_Query();
$sql = "( " .
" `timesheet_config` varchar(25) NOT NULL, " .
" `timesheet_value` varchar(25), " .
" PRIMARY KEY (`timesheet_config`) " .
") ENGINE = MYISAM DEFAULT CHARSET = utf8";
$q->createTable('timesheet_config');
$q->createDefinition($sql);
$result = $q->exec();
return $result;
}
private function _insertConfigurationData() {
$q = new w2p_Database_Query();
$q->addTable('timesheet_config');
$q->addInsert('timesheet_config', 'timesheet_approval_by');
$q->addInsert('timesheet_value', '0');
$q->addInsert('timesheet_config', 'timesheet_book_year');
$q->addInsert('timesheet_value', '2014');
$q->addInsert('timesheet_config', 'timesheet_sort_order');
$q->addInsert('timesheet_value', 'Ascending');
$result = $q->exec();
return $result;
} }
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment