Add delete protection to timesheet

This commit is contained in:
Nathan Gray 2012-10-17 20:24:56 +00:00
parent 789b51d5cd
commit ae77723140
2 changed files with 51 additions and 3 deletions

View File

@ -15,6 +15,7 @@ if (!defined('TIMESHEET_APP'))
define('TIMESHEET_APP','timesheet'); define('TIMESHEET_APP','timesheet');
} }
/** /**
* Business object of the TimeSheet * Business object of the TimeSheet
* *
@ -22,6 +23,11 @@ if (!defined('TIMESHEET_APP'))
*/ */
class timesheet_bo extends so_sql_cf class timesheet_bo extends so_sql_cf
{ {
/**
* Flag for timesheets deleted, but preserved
*/
const DELETED_STATUS = -1;
/** /**
* Timesheets config data * Timesheets config data
* *
@ -214,6 +220,10 @@ class timesheet_bo extends so_sql_cf
//$sorted[$status_id]['name'] = $label; //$sorted[$status_id]['name'] = $label;
unset($sorted[$status_id]['substatus']); unset($sorted[$status_id]['substatus']);
} }
if($this->config_data['history'])
{
$this->status_labels[self::DELETED_STATUS] = 'Deleted';
}
$this->status_labels_config = $sorted; $this->status_labels_config = $sorted;
} }
@ -349,6 +359,11 @@ class timesheet_bo extends so_sql_cf
} }
$ret = $data && !!($grants[$data['ts_owner']] & $required); $ret = $data && !!($grants[$data['ts_owner']] & $required);
if(($required & EGW_ACL_DELETE) && $this->config_data['history'] == 'history' &&
$data['ts_status'] == self::DELETED_STATUS)
{
$ret = !!($GLOBALS['egw_info']['user']['apps']['admin']);
}
//error_log(__METHOD__."($required,$data[ts_id],$user) returning ".array2string($ret)); //error_log(__METHOD__."($required,$data[ts_id],$user) returning ".array2string($ret));
return $ret; return $ret;
} }
@ -480,10 +495,15 @@ class timesheet_bo extends so_sql_cf
} }
} }
} }
if (isset($filter['ts_status']) && $filter['ts_status']) if (isset($filter['ts_status']) && $filter['ts_status'] && $filter['ts_status'] != self::DELETED_STATUS)
{ {
$filter['ts_status'] = $this->get_sub_status($filter['ts_status']); $filter['ts_status'] = $this->get_sub_status($filter['ts_status']);
} }
else
{
$filter[] = '(ts_status ' . ($filter['ts_status'] == self::DELETED_STATUS ? '=':'!= ') . self::DELETED_STATUS .
($filter['ts_status'] == self::DELETED_STATUS ? '':' OR ts_status IS NULL') . ')';
}
if (!count($filter['ts_owner'])) if (!count($filter['ts_owner']))
{ {
$this->total = 0; $this->total = 0;
@ -602,6 +622,12 @@ class timesheet_bo extends so_sql_cf
return false; return false;
} }
// Check for restore of deleted contact, restore held links
if($old && $old['ts_status'] == self::DELETED_STATUS && $new['ts_status'] != self::DELETED_STATUS)
{
egw_link::restore(TIMESHEET_APP, $new['ts_id']);
}
if (!is_object($this->tracking)) if (!is_object($this->tracking))
{ {
$this->tracking = new timesheet_tracking($this); $this->tracking = new timesheet_tracking($this);
@ -637,11 +663,20 @@ class timesheet_bo extends so_sql_cf
} }
$ts_id = is_null($keys) ? $this->data['ts_id'] : $keys['ts_id']; $ts_id = is_null($keys) ? $this->data['ts_id'] : $keys['ts_id'];
if (!$this->check_acl(EGW_ACL_DELETE,$ts_id)) if (!$this->check_acl(EGW_ACL_DELETE,$ts_id) || !($old = $this->read($ts_id)))
{ {
return false; return false;
} }
if (($ret = parent::delete($keys)) && $ts_id)
// check if we only mark timesheets as deleted, or really delete them
if ($old['ts_owner'] && $this->config_data['history'] != '' && $old['ts_status'] != self::DELETED_STATUS)
{
$delete = $old;
$delete['ts_status'] = self::DELETED_STATUS;
$ret = !($this->save($delete));
egw_link::unlink(0,TIMESHEET_APP,$ts_id,'','','',true);
}
elseif (($ret = parent::delete($keys)) && $ts_id)
{ {
// delete all links to timesheet entry $ts_id // delete all links to timesheet entry $ts_id
egw_link::unlink(0,TIMESHEET_APP,$ts_id); egw_link::unlink(0,TIMESHEET_APP,$ts_id);

View File

@ -37,6 +37,19 @@
</select> </select>
</td> </td>
</tr> </tr>
<tr class="th">
<td colspan="2">&nbsp;<b>{lang_History_logging}</b></td>
</tr>
<tr class="row_on">
<td>&nbsp;{lang_Prevent_deleting}</td>
<td>
<select name="newsettings[history]">
<option value="">{lang_No}</option>
<option value="history"{selected_history_history}>{lang_Yes,_only_admins_can_purge_deleted_items}</option>
<option value="userpurge"{selected_history_userpurge}>{lang_Yes,_users_can_purge_their_deleted_items}</option>
</select>
</td>
</tr>
<!-- END body --> <!-- END body -->
<!-- BEGIN footer --> <!-- BEGIN footer -->