When adding a mailing list as participant, immediately expand it to contacts

This commit is contained in:
nathangray 2016-07-12 11:22:25 -06:00
parent 918548665d
commit fada2d433e
3 changed files with 62 additions and 41 deletions

View File

@ -362,6 +362,45 @@ class calendar_bo
return $data; return $data;
} }
/**
* Enumerates the contacts in a contact list, and returns the list of contact IDs
*
* This is used to enable mailing lists as owner/participant
*
* @param string $id Mailing list participant ID, which is the mailing list
* ID prefixed with 'l'
* @param boolean $ignore_acl = false Flag to skip ACL checks
* @param boolean $use_freebusy =true should freebusy rights are taken into account, default true, can be set to false eg. for a search
*
* @return array
*/
public function enum_mailing_list($id, $ignore_acl= false, $use_freebusy = true)
{
$contact_list = array();
$contacts = new Api\Contacts();
if($contacts->check_list((int)substr($id,1), ACL::READ))
{
$options = array('list' => substr($id,1));
$lists = $contacts->search('',true,'','','',false,'AND',false,$options);
if(!$lists)
{
return $contact_list;
}
foreach($lists as &$contact)
{
$contact = 'c'.$contact['id'];
if ($ignore_acl || $this->check_perms(ACL::READ|self::ACL_READ_FOR_PARTICIPANTS|($use_freebusy?self::ACL_FREEBUSY:0),0,$contact))
{
if ($contact && !in_array($contact,$contact_list)) // already added?
{
$contact_list[] = $contact;
}
}
}
}
return $contact_list;
}
/** /**
* Add group-members as participants with status 'G' * Add group-members as participants with status 'G'
* *
@ -413,29 +452,13 @@ class calendar_bo
// Handle email lists // Handle email lists
if(!is_numeric($user) && $user[0] == 'l') if(!is_numeric($user) && $user[0] == 'l')
{ {
$contacts = new Api\Contacts(); foreach($this->enum_mailing_list($user, $ignore_acl, $use_freebusy) as $contact)
if($contacts->check_list((int)substr($user,1), ACL::READ))
{
$users[] = $user;
$options = array('list' => substr($user,1));
$lists = $contacts->search('',true,'','','',false,'AND',false,$options);
if(!$lists)
{
continue;
}
foreach($lists as &$contact)
{
$contact = 'c'.$contact['id'];
if ($ignore_acl || $this->check_perms(ACL::READ|self::ACL_READ_FOR_PARTICIPANTS|($use_freebusy?self::ACL_FREEBUSY:0),0,$contact))
{ {
if ($contact && !in_array($contact,$users)) // already added? if ($contact && !in_array($contact,$users)) // already added?
{ {
$users[] = $contact; $users[] = $contact;
} }
} }
}
}
continue; continue;
} }
if ($ignore_acl || $this->check_perms(ACL::READ|self::ACL_READ_FOR_PARTICIPANTS|($use_freebusy?self::ACL_FREEBUSY:0),0,$user)) if ($ignore_acl || $this->check_perms(ACL::READ|self::ACL_READ_FOR_PARTICIPANTS|($use_freebusy?self::ACL_FREEBUSY:0),0,$user))

View File

@ -839,28 +839,6 @@ class calendar_boupdate extends calendar_bo
} }
} }
} }
// Mailing lists
else if (!is_numeric($userid) && $userid[0] == 'l')
{
if(!$contact_obj)
{
$contact_obj = new Api\Contacts();
}
$options = array('list' => substr($user,1));
$contacts = $contact_obj->search('',true,'','','',false,'AND',false,$options);
if(!$contacts)
{
continue;
}
foreach($contacts as &$contact)
{
$contact = 'c'.$contact['id'];
if ($contact && !isset($to_notify[$contact])) // already added?
{
$to_notify[$contact] = 'G';
}
}
}
} }
$user_prefs = $GLOBALS['egw_info']['user']['preferences']; $user_prefs = $GLOBALS['egw_info']['user']['preferences'];
$startdate = new Api\DateTime($event['start']); $startdate = new Api\DateTime($event['start']);

View File

@ -158,6 +158,16 @@ class calendar_uiforms extends calendar_ui
} }
elseif (is_array($this->bo->resources[$uid[0]])) elseif (is_array($this->bo->resources[$uid[0]]))
{ {
// Expand mailing lists
if($uid[0] == 'l')
{
foreach($this->bo->enum_mailing_list($uid) as $contact)
{
$participants[$contact] = $participant_types['c'][substr($contact,1)] =
calendar_so::combine_status('U',1,'REQ-PARTICIPANT');
}
continue;
}
// if contact is a user, use the user instead (as the GUI) // if contact is a user, use the user instead (as the GUI)
if ($uid[0] == 'c' && ($account_id = $GLOBALS['egw']->accounts->name2id(substr($uid,1),'person_id'))) if ($uid[0] == 'c' && ($account_id = $GLOBALS['egw']->accounts->name2id(substr($uid,1),'person_id')))
{ {
@ -419,6 +429,16 @@ class calendar_uiforms extends calendar_ui
ExecMethod($this->bo->resources[$type]['new_status'],$id) : ExecMethod($this->bo->resources[$type]['new_status'],$id) :
($uid == $this->bo->user ? 'A' : 'U'); ($uid == $this->bo->user ? 'A' : 'U');
// Expand mailing lists
if($type == 'l')
{
foreach($this->bo->enum_mailing_list($participant) as $contact)
{
$event['participants'][$contact] = $event['participant_types']['c'][substr($contact,1)] =
calendar_so::combine_status($status,$content['participants']['quantity'],$content['participants']['role']);
}
continue;
}
if ($status) if ($status)
{ {
$res_info = $this->bo->resource_info($uid); $res_info = $this->bo->resource_info($uid);