From 63117b9ceb363d88f002c7c514cb05544f600c00 Mon Sep 17 00:00:00 2001 From: Nathan Gray Date: Wed, 10 Feb 2010 23:07:43 +0000 Subject: [PATCH] Add an option to keep deleted contacts, and only admins can purge them --- addressbook/inc/class.addressbook_bo.inc.php | 38 +++++++++++++++--- addressbook/inc/class.addressbook_so.inc.php | 24 +++++++++++ addressbook/templates/default/config.tpl | 11 +++++ .../templates/default/images/deleted.png | Bin 0 -> 295 bytes 4 files changed, 68 insertions(+), 5 deletions(-) create mode 100644 addressbook/templates/default/images/deleted.png diff --git a/addressbook/inc/class.addressbook_bo.inc.php b/addressbook/inc/class.addressbook_bo.inc.php index 51a4c21d2f..1461aa0862 100755 --- a/addressbook/inc/class.addressbook_bo.inc.php +++ b/addressbook/inc/class.addressbook_bo.inc.php @@ -134,6 +134,15 @@ class addressbook_bo extends addressbook_so */ protected $tracking; + /** + * Keep deleted addresses, or really delete them + * Set in Admin -> Addressbook -> Site Configuration + * ''=really delete, 'history'=keep, only admins delete + * + * @var string + */ + protected $delete_history = ''; + function __construct($contact_app='addressbook') { parent::__construct($contact_app); @@ -262,6 +271,9 @@ class addressbook_bo extends addressbook_so $this->categories = new categories($this->user,'addressbook'); $this->tracking = new addressbook_tracking($this); + + $config = config::read('phpgwapi'); + $this->delete_history = $config['history']; } /** @@ -661,11 +673,26 @@ class addressbook_bo extends addressbook_so $id = is_array($c) ? $c['id'] : $c; $ok = false; - if ($this->check_perms(EGW_ACL_DELETE,$c,$deny_account_delete) && ($ok = parent::delete($id,$check_etag))) + if ($this->check_perms(EGW_ACL_DELETE,$c,$deny_account_delete)) { - egw_link::unlink(0,'addressbook',$id); - $GLOBALS['egw']->contenthistory->updateTimeStamp('contacts', $id, 'delete', time()); - $this->tracking->track(array('id' => $id), array('id' => $id), null, true); + if(!($old = $this->read($id))) return false; + if($this->delete_history != '' && $old['tid'] != addressbook_so::DELETED_TYPE) + { + $delete = $old; + $delete['tid'] = addressbook_so::DELETED_TYPE; + $ok = $this->save($delete); + egw_link::unlink(0,'addressbook',$id,'','!file'); + } + elseif($ok = parent::delete($id,$check_etag)) + { + egw_link::unlink(0,'addressbook',$id); + } + + // Don't notify of final purge + if($ok && $old['tid'] != addressbook_so::DELETED_TYPE) { + $GLOBALS['egw']->contenthistory->updateTimeStamp('contacts', $id, 'delete', time()); + $this->tracking->track(array('id' => $id), array('id' => $id), null, true); + } } else { @@ -776,7 +803,8 @@ class addressbook_bo extends addressbook_so } // Record change history - $this->tracking->track($to_write, $old); + $deleted = ($old['tid'] == addressbook_so::DELETED_TYPE || $contact['tid'] == addressbook_so::DELETED_TYPE); + $this->tracking->track($to_write, $old, null, $deleted); } return $this->error ? false : $contact['id']; diff --git a/addressbook/inc/class.addressbook_so.inc.php b/addressbook/inc/class.addressbook_so.inc.php index 2947d61000..321da8086d 100755 --- a/addressbook/inc/class.addressbook_so.inc.php +++ b/addressbook/inc/class.addressbook_so.inc.php @@ -164,6 +164,13 @@ class addressbook_so */ var $content_types = array(); + /** + * Special content type to indicate a deleted addressbook + * + * @var String; + */ + const DELETED_TYPE = 'D'; + /** * total number of matches of last search * @@ -303,6 +310,17 @@ class addressbook_so 'icon' => 'navbar.png' ))); } + + // Add in deleted type for admins + if($this->is_admin()) { + $this->content_types[self::DELETED_TYPE] = array( + 'name' => lang('Deleted'), + 'options' => array( + 'template' => 'addressbook.edit', + 'icon' => 'deleted.png' + ) + ); + } } /** @@ -585,6 +603,12 @@ class addressbook_so { $filter['adr_one_countryname'] = $GLOBALS['egw']->country->get_full_name($filter['adr_one_countryname']); } + + // Hide deleted items unless type is specifically deleted + if(array_key_exists('tid', $filter) && $filter['tid'] !== self::DELETED_TYPE) { + $filter[] = 'contact_tid != \'' . self::DELETED_TYPE . '\''; + } + $backend =& $this->get_backend(null,$filter['owner']); // single string to search for --> create so_sql conformant search criterial for the standard search columns if ($criteria && !is_array($criteria)) diff --git a/addressbook/templates/default/config.tpl b/addressbook/templates/default/config.tpl index 4b9decd916..05fdfb41a8 100644 --- a/addressbook/templates/default/config.tpl +++ b/addressbook/templates/default/config.tpl @@ -67,6 +67,17 @@ {lang_(empty_=_use_global_limit,_no_=_no_export_at_all)}: + +  {lang_History_logging} + + +  {lang_Prevent_deleting_of_contacts} + + +  {lang_Contact_maintenance} diff --git a/addressbook/templates/default/images/deleted.png b/addressbook/templates/default/images/deleted.png new file mode 100644 index 0000000000000000000000000000000000000000..69d558ba6ec85bc1e23a5a20b77fa1f6169c4f46 GIT binary patch literal 295 zcmeAS@N?(olHy`uVBq!ia0vp^A|TAd%)r3NvA|#jkRuV`6XN>+|NlR4U%ku;dKPB! zesaTOXT>j@m;StVE~3S#7N~}?B*-tA!Qt7BG!Q4r+uem-EV1J?kRw*&8c`CQpH@hh91 qO>H7_^3RC)=RUHsS@nzO2lL6*;y)|f&j