resurrect preference to sync all ABs into one (allways implied for OS X) and new pref to "Distributionlists as groups", plus explenation of the prefs

This commit is contained in:
Ralf Becker 2012-02-04 21:47:28 +00:00
parent d89f48d9c1
commit d7fca17d6e
2 changed files with 37 additions and 9 deletions

View File

@ -80,8 +80,21 @@ class addressbook_groupdav extends groupdav_handler
function propfind($path,$options,&$files,$user,$id='') function propfind($path,$options,&$files,$user,$id='')
{ {
$filter = array(); $filter = array();
$ab_pref = explode(',',$GLOBALS['egw_info']['user']['preferences']['groupdav']['addressbook-home-set']);
// If "Sync selected addressbooks into one" is set
if ($user && $user == $GLOBALS['egw_info']['user']['account_id'] && in_array('O',$ab_pref))
{
$filter['contact_owner'] = array_keys($this->get_shared(true)); // true: ignore all-in-one pref
$filter['contact_owner'][] = $user;
}
// show addressbook of a single user? // show addressbook of a single user?
if ($user && $path != '/addressbook/' || $user === 0) $filter['contact_owner'] = $user; elseif ($user && $path != '/addressbook/' || $user === 0)
{
$filter['contact_owner'] = $user;
}
// if "Distirbution lists as groups" is selected
$filter['do_groups'] = in_array('D',$ab_pref);
// should we hide the accounts addressbook // should we hide the accounts addressbook
if ($GLOBALS['egw_info']['user']['preferences']['addressbook']['hide_accounts']) $filter['account_id'] = null; if ($GLOBALS['egw_info']['user']['preferences']['addressbook']['hide_accounts']) $filter['account_id'] = null;
@ -136,6 +149,10 @@ class addressbook_groupdav extends groupdav_handler
$handler = self::_get_handler(); $handler = self::_get_handler();
} }
unset($filter['address_data']); unset($filter['address_data']);
$do_groups = $filter['do_groups'];
unset($filter['do_groups']);
if (isset($filter['order'])) if (isset($filter['order']))
{ {
$order = $filter['order']; $order = $filter['order'];
@ -168,7 +185,7 @@ class addressbook_groupdav extends groupdav_handler
} }
} }
// add groups after contacts // add groups after contacts
if (!$start || count($contacts) < $start[1]) if ($do_groups && (!$start || count($contacts) < $start[1]))
{ {
$where = array( $where = array(
'list_owner' => isset($filter['contact_owner'])?$filter['contact_owner']:array_keys($this->bo->grants) 'list_owner' => isset($filter['contact_owner'])?$filter['contact_owner']:array_keys($this->bo->grants)
@ -177,10 +194,9 @@ class addressbook_groupdav extends groupdav_handler
{ {
$where['list_'.self::$path_attr] = $filter[self::$path_attr]; $where['list_'.self::$path_attr] = $filter[self::$path_attr];
} }
//error_log(__METHOD__."() filter=".array2string($filter).', where='.array2string($where)); //error_log(__METHOD__."() filter=".array2string($filter).", do_groups=$do_groups, where=".array2string($where));
if (($lists = $this->bo->read_lists($where,'contact_uid',true))) // true = limit to contacts in same AB! if (($lists = $this->bo->read_lists($where,'contact_uid',$where['list_owner']))) // limit to contacts in same AB!
{ {
//_debug_array($lists);
foreach($lists as $list) foreach($lists as $list)
{ {
$list['carddav_name'] = $list['list_carddav_name']; $list['carddav_name'] = $list['list_carddav_name'];
@ -777,14 +793,19 @@ class addressbook_groupdav extends groupdav_handler
/** /**
* Return calendars/addressbooks shared from other users with the current one * Return calendars/addressbooks shared from other users with the current one
* *
* return array account_id => account_lid pairs * @param boolean $ignore_all_in_one=false if true, return selected addressbooks and not array() for all-in-one
* @return array account_id => account_lid pairs
*/ */
function get_shared() function get_shared($ignore_all_in_one=false)
{ {
$shared = array(); $shared = array();
$addressbook_home_set = $GLOBALS['egw_info']['user']['preferences']['groupdav']['addressbook-home-set']; $addressbook_home_set = $GLOBALS['egw_info']['user']['preferences']['groupdav']['addressbook-home-set'];
if (empty($addressbook_home_set)) $addressbook_home_set = 'P'; // personal addressbook if (empty($addressbook_home_set)) $addressbook_home_set = 'P'; // personal addressbook
$addressbook_home_set = explode(',',$addressbook_home_set); $addressbook_home_set = explode(',',$addressbook_home_set);
// if "Sync all selected addressbook into one" is set --> no (additional) shared addressbooks
if (!$ignore_all_in_one && in_array('O',$addressbook_home_set)) return array();
// replace symbolic id's with real nummeric id's // replace symbolic id's with real nummeric id's
foreach(array( foreach(array(
'G' => $GLOBALS['egw_info']['user']['account_primary_group'], 'G' => $GLOBALS['egw_info']['user']['account_primary_group'],
@ -799,7 +820,7 @@ class addressbook_groupdav extends groupdav_handler
foreach($this->bo->get_addressbooks(EGW_ACL_READ) as $id => $label) foreach($this->bo->get_addressbooks(EGW_ACL_READ) as $id => $label)
{ {
if (($id || !$GLOBALS['egw_info']['user']['preferences']['addressbook']['hide_accounts']) && if (($id || !$GLOBALS['egw_info']['user']['preferences']['addressbook']['hide_accounts']) &&
$user != $id && // no current user and no accounts, if disabled in ab prefs $GLOBALS['egw_info']['user']['account_id'] != $id && // no current user and no accounts, if disabled in ab prefs
(in_array('A',$addressbook_home_set) || in_array((string)$id,$addressbook_home_set)) && (in_array('A',$addressbook_home_set) || in_array((string)$id,$addressbook_home_set)) &&
is_numeric($id) && ($owner = $id ? $this->accounts->id2name($id) : 'accounts')) is_numeric($id) && ($owner = $id ? $this->accounts->id2name($id) : 'accounts'))
{ {
@ -832,6 +853,8 @@ class addressbook_groupdav extends groupdav_handler
'A' => lang('All'), 'A' => lang('All'),
'G' => lang('Primary Group'), 'G' => lang('Primary Group'),
'U' => lang('Accounts'), 'U' => lang('Accounts'),
'O' => lang('Sync all selected into one'),
'D' => lang('Distribution lists as groups')
) + $addressbooks; ) + $addressbooks;
// rewriting owner=0 to 'U', as 0 get's always selected by prefs // rewriting owner=0 to 'U', as 0 get's always selected by prefs
@ -849,7 +872,10 @@ class addressbook_groupdav extends groupdav_handler
'type' => 'multiselect', 'type' => 'multiselect',
'label' => 'Addressbooks to sync in addition to personal addressbook', 'label' => 'Addressbooks to sync in addition to personal addressbook',
'name' => 'addressbook-home-set', 'name' => 'addressbook-home-set',
'help' => lang('Only supported by a few fully conformant clients (eg. from Apple). If you have to enter a URL, it will most likly not be suppored!').'<br/>'.lang('They will be sub-folders in users home (%1 attribute).','CardDAV "addressbook-home-set"'), 'help' => lang('Only supported by a few fully conformant clients (eg. from Apple). If you have to enter a URL, it will most likly not be suppored!').
'<br/>'.lang('They will be sub-folders in users home (%1 attribute).','CardDAV "addressbook-home-set"').
'<br/>'.lang('Select "%1", if your client does not support multiple addressbooks.',lang('Sync all selected into one')).
'<br/>'.lang('Select "%1", if your client support groups, eg. OS X or iOS addressbook.',lang('Distribution lists as groups')),
'values' => $addressbooks, 'values' => $addressbooks,
'xmlrpc' => True, 'xmlrpc' => True,
'admin' => False, 'admin' => False,

View File

@ -386,6 +386,8 @@ abstract class groupdav_handler
{ {
if ((int)$matches[1] < 868) $agent .= '_old'; if ((int)$matches[1] < 868) $agent .= '_old';
} }
// sillently switch "Sync all into one" preference on, as OS X addressbook only supports one AB
$GLOBALS['egw_info']['user']['preferences']['groupdav']['addressbook-home-set'] .= ',O';
break; break;
case 'kde': case 'kde':
// Akonadi (new KDE Pim framework) unfortunately has same user-agent as old kde // Akonadi (new KDE Pim framework) unfortunately has same user-agent as old kde