- added ability to store participant roles to calendar backend,

currently not settable via GUI, but GUI leaves them untouched
- showing quantity for resources in brackets behind resource name
- docu and formatting updates all over the place
This commit is contained in:
Ralf Becker 2009-08-04 17:14:16 +00:00
parent e757e53819
commit c29ab01e8d
9 changed files with 137 additions and 105 deletions

View File

@ -6,7 +6,7 @@
* @package calendar * @package calendar
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de> * @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @author Joerg Lehrke <jlehrke@noc.de> * @author Joerg Lehrke <jlehrke@noc.de>
* @copyright (c) 2004-8 by RalfBecker-At-outdoor-training.de * @copyright (c) 2004-9 by RalfBecker-At-outdoor-training.de
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$ * @version $Id$
*/ */
@ -22,7 +22,7 @@ define('WEEK_s',7*DAY_s);
/** /**
* Gives read access to the calendar, but all events the user is not participating are private! * Gives read access to the calendar, but all events the user is not participating are private!
* Used be the addressbook. * Used by addressbook.
*/ */
define('EGW_ACL_READ_FOR_PARTICIPANTS',EGW_ACL_CUSTOM_1); define('EGW_ACL_READ_FOR_PARTICIPANTS',EGW_ACL_CUSTOM_1);
define('EGW_ACL_FREEBUSY',EGW_ACL_CUSTOM_2); define('EGW_ACL_FREEBUSY',EGW_ACL_CUSTOM_2);
@ -203,7 +203,7 @@ class calendar_bo
/** /**
* returns info about email addresses as participants * returns info about email addresses as participants
* *
* @param int/array $ids single contact-id or array of id's * @param int|array $ids single contact-id or array of id's
* @return array * @return array
*/ */
static function email_info($ids) static function email_info($ids)
@ -544,7 +544,7 @@ class calendar_bo
} }
} }
// update the horizont // update the horizont
$config =& CreateObject('phpgwapi.config','calendar'); $config = CreateObject('phpgwapi.config','calendar');
$config->save_value('horizont',$this->config['horizont'],'calendar'); $config->save_value('horizont',$this->config['horizont'],'calendar');
if ($this->debug == 'check_move_horizont') $this->debug_message('bocal::check_move_horizont(%1) new horizont=%2, exiting',true,$new_horizont,$this->config['horizont']); if ($this->debug == 'check_move_horizont') $this->debug_message('bocal::check_move_horizont(%1) new horizont=%2, exiting',true,$new_horizont,$this->config['horizont']);
@ -628,7 +628,7 @@ class calendar_bo
* convert a date from server to user-time * convert a date from server to user-time
* *
* @param int $date timestamp in server-time * @param int $date timestamp in server-time
* @param $date_format='ts' date-formats: 'ts'=timestamp, 'server'=timestamp in server-time, 'array'=array or string with date-format * @param string $date_format='ts' date-formats: 'ts'=timestamp, 'server'=timestamp in server-time, 'array'=array or string with date-format
*/ */
function date2usertime($ts,$date_format='ts') function date2usertime($ts,$date_format='ts')
{ {
@ -654,7 +654,7 @@ class calendar_bo
/** /**
* Reads a calendar-entry * Reads a calendar-entry
* *
* @param int/array/string $ids id or array of id's of the entries to read, or string with a single uid * @param int|array|string $ids id or array of id's of the entries to read, or string with a single uid
* @param mixed $date=null date to specify a single event of a series * @param mixed $date=null date to specify a single event of a series
* @param boolean $ignore_acl should we ignore the acl, default False for a single id, true for multiple id's * @param boolean $ignore_acl should we ignore the acl, default False for a single id, true for multiple id's
* @param string $date_format='ts' date-formats: 'ts'=timestamp, 'server'=timestamp in servertime, 'array'=array, or string with date-format * @param string $date_format='ts' date-formats: 'ts'=timestamp, 'server'=timestamp in servertime, 'array'=array, or string with date-format
@ -714,11 +714,11 @@ class calendar_bo
* We insert now all repetions of one event in one go. It should be possible to calculate the time-difference * We insert now all repetions of one event in one go. It should be possible to calculate the time-difference
* of the used recur-type and add all events in one simple for-loop. Daylightsaving changes need to be taken into Account. * of the used recur-type and add all events in one simple for-loop. Daylightsaving changes need to be taken into Account.
* *
* @param $event array repeating event whos repetions should be inserted * @param array $event repeating event whos repetions should be inserted
* @param $start mixed start-date * @param mixed $start start-date
* @param $end mixed end-date * @param mixed $end end-date
* @param $events array where the repetions get inserted * @param array $events where the repetions get inserted
* @param $recur_exceptions array with date (in Ymd) as key (and True as values) * @param array $recur_exceptions with date (in Ymd) as key (and True as values)
*/ */
function insert_all_repetitions($event,$start,$end,&$events,$recur_exceptions) function insert_all_repetitions($event,$start,$end,&$events,$recur_exceptions)
{ {
@ -898,9 +898,9 @@ class calendar_bo
/** /**
* Adds one repetion of $event for $date_ymd to the $events array, after adjusting its start- and end-time * Adds one repetion of $event for $date_ymd to the $events array, after adjusting its start- and end-time
* *
* @param $events array in which the event gets inserted * @param array $events array in which the event gets inserted
* @param $event array event to insert, it has start- and end-date of the first recurrence, not of $date_ymd * @param array $event event to insert, it has start- and end-date of the first recurrence, not of $date_ymd
* @param $date_ymd int/string of the date of the event * @param int|string $date_ymd of the date of the event
*/ */
function add_adjusted_event(&$events,$event,$date_ymd) function add_adjusted_event(&$events,$event,$date_ymd)
{ {
@ -931,7 +931,7 @@ class calendar_bo
* We do some caching here, as the resource itself might not do it. * We do some caching here, as the resource itself might not do it.
* *
* @param string $uid string with one-letter resource-type and numerical resource-id, eg. "r19" * @param string $uid string with one-letter resource-type and numerical resource-id, eg. "r19"
* @return array/boolean array with keys res_id,cat_id,name,useable (name definied by max_quantity in $this->resources),rights,responsible or false if $uid is not found * @return array|boolean array with keys res_id,cat_id,name,useable (name definied by max_quantity in $this->resources),rights,responsible or false if $uid is not found
*/ */
function resource_info($uid) function resource_info($uid)
{ {
@ -1068,11 +1068,11 @@ class calendar_bo
/** /**
* Converts several date-types to a timestamp and optionaly converts user- to server-time * Converts several date-types to a timestamp and optionaly converts user- to server-time
* *
* @param $date mixed date to convert, should be one of the following types * @param mixed $date date to convert, should be one of the following types
* string (!) in form YYYYMMDD or iso8601 YYYY-MM-DDThh:mm:ss or YYYYMMDDThhmmss * string (!) in form YYYYMMDD or iso8601 YYYY-MM-DDThh:mm:ss or YYYYMMDDThhmmss
* int already a timestamp * int already a timestamp
* array with keys 'second', 'minute', 'hour', 'day' or 'mday' (depricated !), 'month' and 'year' * array with keys 'second', 'minute', 'hour', 'day' or 'mday' (depricated !), 'month' and 'year'
* @param $user2server_time boolean conversation between user- and server-time default False == Off * @param boolean $user2server_time conversation between user- and server-time default False == Off
*/ */
function date2ts($date,$user2server=False) function date2ts($date,$user2server=False)
{ {
@ -1149,8 +1149,8 @@ class calendar_bo
/** /**
* Converts a date to an array and optionaly converts server- to user-time * Converts a date to an array and optionaly converts server- to user-time
* *
* @param $date mixed date to convert * @param mixed $date date to convert
* @param $server2user_time boolean conversation between user- and server-time default False == Off * @param boolean $server2user_time conversation between user- and server-time default False == Off
* @return array with keys 'second', 'minute', 'hour', 'day', 'month', 'year', 'raw' (timestamp) and 'full' (Ymd-string) * @return array with keys 'second', 'minute', 'hour', 'day', 'month', 'year', 'raw' (timestamp) and 'full' (Ymd-string)
*/ */
function date2array($date,$server2user=False) function date2array($date,$server2user=False)
@ -1230,7 +1230,7 @@ class calendar_bo
* Formats a date given as timestamp or array * Formats a date given as timestamp or array
* *
* @param mixed $date integer timestamp or array with ('year','month',..,'second') to convert * @param mixed $date integer timestamp or array with ('year','month',..,'second') to convert
* @param string/boolean $format='' default common_prefs[dateformat], common_prefs[timeformat], false=time only, true=date only * @param string|boolean $format='' default common_prefs[dateformat], common_prefs[timeformat], false=time only, true=date only
* @return string the formated date (incl. time) * @return string the formated date (incl. time)
*/ */
function format_date($date,$format='') function format_date($date,$format='')
@ -1264,10 +1264,10 @@ class calendar_bo
* *
* The parameters get formated depending on their type. ACL-values need a ACL_TYPE_IDENTIFER prefix. * The parameters get formated depending on their type. ACL-values need a ACL_TYPE_IDENTIFER prefix.
* *
* @param $msg string message with parameters/variables like lang(), eg. '%1' * @param string $msg message with parameters/variables like lang(), eg. '%1'
* @param $backtrace include a function-backtrace, default True=On * @param boolean $backtrace=True include a function-backtrace, default True=On
* should only be set to False=Off, if your code ensures a call with backtrace=On was made before !!! * should only be set to False=Off, if your code ensures a call with backtrace=On was made before !!!
* @param $param mixed a variable number of parameters, to be inserted in $msg * @param mixed $param a variable number of parameters, to be inserted in $msg
* arrays get serialized with print_r() ! * arrays get serialized with print_r() !
*/ */
function debug_message($msg,$backtrace=True) function debug_message($msg,$backtrace=True)
@ -1449,7 +1449,7 @@ class calendar_bo
/** /**
* Converts a participant into a (readable) user- or resource-name * Converts a participant into a (readable) user- or resource-name
* *
* @param $id string/int id of user or resource * @param string|int $id id of user or resource
* @return string with name * @return string with name
*/ */
function participant_name($id,$use_type=false) function participant_name($id,$use_type=false)
@ -1490,11 +1490,19 @@ class calendar_bo
$names = array(); $names = array();
foreach($event['participants'] as $id => $status) foreach($event['participants'] as $id => $status)
{ {
$quantity = $role = '';
if (strlen($status) > 1 && preg_match('/^.([0-9]*)(.*)$/',$status,$matches))
{
if ((int)$matches[1] > 1) $quantity = (int)$matches[1];
$role = $matches[2];
}
$status = $status[0];
if ($status == 'G' && !$show_group_invitation) continue; // dont show group-invitation if ($status == 'G' && !$show_group_invitation) continue; // dont show group-invitation
if (!$long_status) if (!$long_status)
{ {
switch($status) switch($status[0])
{ {
case 'A': // accepted case 'A': // accepted
$status = html::image('calendar','agt_action_success',$this->verbose_status[$status]); $status = html::image('calendar','agt_action_success',$this->verbose_status[$status]);
@ -1518,7 +1526,8 @@ class calendar_bo
{ {
$status = '('.$this->verbose_status[$status].')'; $status = '('.$this->verbose_status[$status].')';
} }
$names[$id] = $this->participant_name($id).' '.$status; $names[$id] = $this->participant_name($id).($quantity ? ' ('.$quantity.')' : '').
' '.$status.($role ? ' '.lang(str_replace('X-','',$role)) : '');
} }
return $names; return $names;
} }
@ -1526,8 +1535,8 @@ class calendar_bo
/** /**
* Converts category string of an event into array of (readable) category-names * Converts category string of an event into array of (readable) category-names
* *
* @param $category string cat-id (multiple id's commaseparated) * @param string $category cat-id (multiple id's commaseparated)
* @param $color int color of the category, if multiple cats, the color of the last one with color is returned * @param int $color color of the category, if multiple cats, the color of the last one with color is returned
* @return array with id / names * @return array with id / names
*/ */
function categories($category,&$color) function categories($category,&$color)
@ -1537,7 +1546,7 @@ class calendar_bo
$color = 0; $color = 0;
if (!is_object($this->cats)) if (!is_object($this->cats))
{ {
$this->cats =& CreateObject('phpgwapi.categories','','calendar'); $this->cats = CreateObject('phpgwapi.categories','','calendar');
} }
foreach(explode(',',$category) as $cat_id) foreach(explode(',',$category) as $cat_id)
{ {
@ -1666,7 +1675,7 @@ class calendar_bo
* *
* The holidays get cached in the session (performance), so changes in holidays or birthdays do NOT affect a current session!!! * The holidays get cached in the session (performance), so changes in holidays or birthdays do NOT affect a current session!!!
* *
* @param integer $year=0 year, defaults to 0 = current year * @param int $year=0 year, defaults to 0 = current year
* @return array indexed with Ymd of array of holidays. A holiday is an array with the following fields: * @return array indexed with Ymd of array of holidays. A holiday is an array with the following fields:
* index: numerical unique id * index: numerical unique id
* locale: string, 2-char short for the nation * locale: string, 2-char short for the nation
@ -1689,7 +1698,7 @@ class calendar_bo
{ {
if (!is_object($this->holidays)) if (!is_object($this->holidays))
{ {
$this->holidays =& CreateObject('calendar.boholiday'); $this->holidays = CreateObject('calendar.boholiday');
} }
$this->holidays->prepare_read_holidays($year); $this->holidays->prepare_read_holidays($year);
$this->cached_holidays[$year] = $this->holidays->read_holiday(); $this->cached_holidays[$year] = $this->holidays->read_holiday();
@ -1697,7 +1706,7 @@ class calendar_bo
// search for birthdays // search for birthdays
if ($GLOBALS['egw_info']['server']['hide_birthdays'] != 'yes') if ($GLOBALS['egw_info']['server']['hide_birthdays'] != 'yes')
{ {
$contacts =& CreateObject('phpgwapi.contacts'); $contacts = CreateObject('phpgwapi.contacts');
$bdays =& $contacts->read(0,0,array('id','n_family','n_given','n_prefix','n_middle','bday'),'',"bday=!'',n_family=!''",'ASC','bday'); $bdays =& $contacts->read(0,0,array('id','n_family','n_given','n_prefix','n_middle','bday'),'',"bday=!'',n_family=!''",'ASC','bday');
if ($bdays) if ($bdays)
{ {
@ -1733,8 +1742,8 @@ class calendar_bo
* *
* Is called as hook to participate in the linking * Is called as hook to participate in the linking
* *
* @param int/array $entry int cal_id or array with event * @param int|array $entry int cal_id or array with event
* @param string/boolean string with title, null if not found or false if not read perms * @param string|boolean string with title, null if not found or false if not read perms
*/ */
function link_title($event) function link_title($event)
{ {
@ -1755,7 +1764,7 @@ class calendar_bo
* Is called as hook to participate in the linking * Is called as hook to participate in the linking
* *
* @param string $pattern pattern to search * @param string $pattern pattern to search
* @return array with pm_id - title pairs of the matching entries * @return array with cal_id - title pairs of the matching entries
*/ */
function link_query($pattern) function link_query($pattern)
{ {
@ -1841,7 +1850,7 @@ class calendar_bo
/** /**
* Get the freebusy URL of a user * Get the freebusy URL of a user
* *
* @param int/string $user account_id or account_lid * @param int|string $user account_id or account_lid
* @param string $pw=null password * @param string $pw=null password
*/ */
static function freebusy_url($user,$pw=null) static function freebusy_url($user,$pw=null)
@ -1857,16 +1866,15 @@ class calendar_bo
/** /**
* Check if the event is the whole day * Check if the event is the whole day
* *
* @param event * @param array $event event
* @return boolean true for whole day events * @return boolean true if whole day event, false othwerwise
*/ */
function isWholeDay($event) function isWholeDay($event)
{ {
// check if the event is the whole day // check if the event is the whole day
$start = $this->date2array($event['start']); $start = $this->date2array($event['start']);
$end = $this->date2array($event['end']); $end = $this->date2array($event['end']);
$result = (!$start['hour'] && !$start['minute']
&& $end['hour'] == 23 && $end['minute'] == 59); return !$start['hour'] && !$start['minute'] && $end['hour'] == 23 && $end['minute'] == 59;
return $result;
} }
} }

View File

@ -11,7 +11,7 @@
* @version $Id$ * @version $Id$
*/ */
// types of messsages send by bocalupdate::send_update // types of messsages send by calendar_boupdate::send_update
define('MSG_DELETED',0); define('MSG_DELETED',0);
define('MSG_MODIFIED',1); define('MSG_MODIFIED',1);
define('MSG_ADDED',2); define('MSG_ADDED',2);
@ -52,7 +52,7 @@ class calendar_boupdate extends calendar_bo
var $debug; var $debug;
/** /**
* @var string/boolean $log_file filename to enable the login or false for no update-logging * @var string|boolean $log_file filename to enable the login or false for no update-logging
*/ */
var $log_file = false; var $log_file = false;
@ -61,11 +61,11 @@ class calendar_boupdate extends calendar_bo
*/ */
function __construct() function __construct()
{ {
if ($this->debug > 0) $this->debug_message('bocalupdate::bocalupdate() started',True); if ($this->debug > 0) $this->debug_message('calendar_boupdate::__construct() started',True);
parent::__construct(); // calling the parent constructor parent::__construct(); // calling the parent constructor
if ($this->debug > 0) $this->debug_message('bocalupdate::bocalupdate() finished',True); if ($this->debug > 0) $this->debug_message('calendar_boupdate::__construct() finished',True);
} }
/** /**
@ -83,7 +83,7 @@ class calendar_boupdate extends calendar_bo
//error_log(__METHOD__."(".array2string($event).",$ignore_conflicts,$touch_modified,$ignore_acl)"); //error_log(__METHOD__."(".array2string($event).",$ignore_conflicts,$touch_modified,$ignore_acl)");
if ($this->debug > 1 || $this->debug == 'update') if ($this->debug > 1 || $this->debug == 'update')
{ {
$this->debug_message('bocalupdate::update(%1,ignore_conflict=%2,touch_modified=%3,ignore_acl=%4)', $this->debug_message('calendar_boupdate::update(%1,ignore_conflict=%2,touch_modified=%3,ignore_acl=%4)',
false,$event,$ignore_conflicts,$touch_modified,$ignore_acl); false,$event,$ignore_conflicts,$touch_modified,$ignore_acl);
} }
// check some minimum requirements: // check some minimum requirements:
@ -153,7 +153,7 @@ class calendar_boupdate extends calendar_bo
)); ));
if ($this->debug > 2 || $this->debug == 'update') if ($this->debug > 2 || $this->debug == 'update')
{ {
$this->debug_message('bocalupdate::update() checking for potential overlapping events for users %1 from %2 to %3',false,$users,$event['start'],$event['end']); $this->debug_message('calendar_boupdate::update() checking for potential overlapping events for users %1 from %2 to %3',false,$users,$event['start'],$event['end']);
} }
$max_quantity = $possible_quantity_conflicts = $conflicts = array(); $max_quantity = $possible_quantity_conflicts = $conflicts = array();
foreach((array) $overlapping_events as $k => $overlap) foreach((array) $overlapping_events as $k => $overlap)
@ -166,7 +166,7 @@ class calendar_boupdate extends calendar_bo
} }
if ($this->debug > 3 || $this->debug == 'update') if ($this->debug > 3 || $this->debug == 'update')
{ {
$this->debug_message('bocalupdate::update() checking overlapping event %1',false,$overlap); $this->debug_message('calendar_boupdate::update() checking overlapping event %1',false,$overlap);
} }
// check if the overlap is with a rejected participant or within the allowed quantity // check if the overlap is with a rejected participant or within the allowed quantity
$common_parts = array_intersect($users,array_keys($overlap['participants'])); $common_parts = array_intersect($users,array_keys($overlap['participants']));
@ -199,7 +199,7 @@ class calendar_boupdate extends calendar_bo
{ {
if ($this->debug > 3 || $this->debug == 'update') if ($this->debug > 3 || $this->debug == 'update')
{ {
$this->debug_message('bocalupdate::update() conflicts with the following participants found %1',false,$common_parts); $this->debug_message('calendar_boupdate::update() conflicts with the following participants found %1',false,$common_parts);
} }
$conflicts[$overlap['id'].'-'.$this->date2ts($overlap['start'])] =& $overlapping_events[$k]; $conflicts[$overlap['id'].'-'.$this->date2ts($overlap['start'])] =& $overlapping_events[$k];
} }
@ -235,7 +235,7 @@ class calendar_boupdate extends calendar_bo
} }
if ($this->debug > 2 || $this->debug == 'update') if ($this->debug > 2 || $this->debug == 'update')
{ {
$this->debug_message('bocalupdate::update() %1 conflicts found %2',false,count($conflicts),$conflicts); $this->debug_message('calendar_boupdate::update() %1 conflicts found %2',false,count($conflicts),$conflicts);
} }
return $conflicts; return $conflicts;
} }
@ -300,7 +300,7 @@ class calendar_boupdate extends calendar_bo
{ {
$modified = $added = $deleted = array(); $modified = $added = $deleted = array();
//echo "<p>bocalupdate::check4update() new participants = ".print_r($new_event['participants'],true).", old participants =".print_r($old_event['participants'],true)."</p>\n"; //echo "<p>calendar_boupdate::check4update() new participants = ".print_r($new_event['participants'],true).", old participants =".print_r($old_event['participants'],true)."</p>\n";
// Find modified and deleted participants ... // Find modified and deleted participants ...
foreach($old_event['participants'] as $old_userid => $old_status) foreach($old_event['participants'] as $old_userid => $old_status)
@ -322,7 +322,7 @@ class calendar_boupdate extends calendar_bo
$added[$new_userid] = 'U'; $added[$new_userid] = 'U';
} }
} }
//echo "<p>bocalupdate::check4update() added=".print_r($added,true).", modified=".print_r($modified,true).", deleted=".print_r($deleted,true)."</p>\n"; //echo "<p>calendar_boupdate::check4update() added=".print_r($added,true).", modified=".print_r($modified,true).", deleted=".print_r($deleted,true)."</p>\n";
if(count($added) || count($modified) || count($deleted)) if(count($added) || count($modified) || count($deleted))
{ {
if(count($added)) if(count($added))
@ -393,7 +393,7 @@ class calendar_boupdate extends calendar_bo
case 'no': case 'no':
break; break;
} }
//echo "<p>bocalupdate::update_requested(user=$userid,pref=".$part_prefs['calendar']['receive_updates'] .",msg_type=$msg_type,".($old_event?$old_event['title']:'False').",".($old_event?$old_event['title']:'False').") = $want_update</p>\n"; //echo "<p>calendar_boupdate::update_requested(user=$userid,pref=".$part_prefs['calendar']['receive_updates'] .",msg_type=$msg_type,".($old_event?$old_event['title']:'False').",".($old_event?$old_event['title']:'False').") = $want_update</p>\n";
return $want_update > 0; return $want_update > 0;
} }
@ -533,7 +533,7 @@ class calendar_boupdate extends calendar_bo
} }
if($userid != $GLOBALS['egw_info']['user']['account_id'] || $msg_type == MSG_ALARM) if($userid != $GLOBALS['egw_info']['user']['account_id'] || $msg_type == MSG_ALARM)
{ {
$preferences =& CreateObject('phpgwapi.preferences',$userid); $preferences = CreateObject('phpgwapi.preferences',$userid);
$part_prefs = $preferences->read_repository(); $part_prefs = $preferences->read_repository();
if (!$this->update_requested($userid,$part_prefs,$msg_type,$old_event,$new_event)) if (!$this->update_requested($userid,$part_prefs,$msg_type,$old_event,$new_event))
@ -667,13 +667,13 @@ class calendar_boupdate extends calendar_bo
} }
/** /**
* saves an event to the database, does NOT do any notifications, see bocalupdate::update for that * saves an event to the database, does NOT do any notifications, see calendar_boupdate::update for that
* *
* This methode converts from user to server time and handles the insertion of users and dates of repeating events * This methode converts from user to server time and handles the insertion of users and dates of repeating events
* *
* @param array $event * @param array $event
* @param boolean $ignore_acl=false should we ignore the acl * @param boolean $ignore_acl=false should we ignore the acl
* @return int/boolean $cal_id > 0 or false on error (eg. permission denied) * @return int|boolean $cal_id > 0 or false on error (eg. permission denied)
*/ */
function save($event, $ignore_acl=false) function save($event, $ignore_acl=false)
{ {
@ -728,8 +728,8 @@ class calendar_boupdate extends calendar_bo
* *
* For contacts we use edit rights of the owner of the event (aka. edit rights of the event). * For contacts we use edit rights of the owner of the event (aka. edit rights of the event).
* *
* @param int/string $uid account_id or 1-char type-identifer plus id (eg. c15 for addressbook entry #15) * @param int|string $uid account_id or 1-char type-identifer plus id (eg. c15 for addressbook entry #15)
* @param array/int $event event array or id of the event * @param array|int $event event array or id of the event
* @return boolean * @return boolean
*/ */
function check_status_perms($uid,$event) function check_status_perms($uid,$event)
@ -753,9 +753,9 @@ class calendar_boupdate extends calendar_bo
/** /**
* set the status of one participant for a given recurrence or for all recurrences since now (includes recur_date=0) * set the status of one participant for a given recurrence or for all recurrences since now (includes recur_date=0)
* *
* @param int/array $event event-array or id of the event * @param int|array $event event-array or id of the event
* @param string/int $uid account_id or 1-char type-identifer plus id (eg. c15 for addressbook entry #15) * @param string|int $uid account_id or 1-char type-identifer plus id (eg. c15 for addressbook entry #15)
* @param int/char $status numeric status (defines) or 1-char code: 'R', 'U', 'T' or 'A' * @param int|char $status numeric status (defines) or 1-char code: 'R', 'U', 'T' or 'A'
* @param int $recur_date=0 date to change, or 0 = all since now * @param int $recur_date=0 date to change, or 0 = all since now
* @param boolean $ignore_acl=false do not check the permisions for the $uid, if true * @param boolean $ignore_acl=false do not check the permisions for the $uid, if true
* @return int number of changed recurrences * @return int number of changed recurrences
@ -763,7 +763,7 @@ class calendar_boupdate extends calendar_bo
function set_status($event,$uid,$status,$recur_date=0, $ignore_acl=false) function set_status($event,$uid,$status,$recur_date=0, $ignore_acl=false)
{ {
$cal_id = is_array($event) ? $event['id'] : $event; $cal_id = is_array($event) ? $event['id'] : $event;
//echo "<p>bocalupdate::set_status($cal_id,$uid,$status,$recur_date)</p>\n"; //echo "<p>calendar_boupdate::set_status($cal_id,$uid,$status,$recur_date)</p>\n";
if (!$cal_id || (!$ignore_acl && !$this->check_status_perms($uid,$event))) if (!$cal_id || (!$ignore_acl && !$this->check_status_perms($uid,$event)))
{ {
return false; return false;
@ -1050,7 +1050,7 @@ class calendar_boupdate extends calendar_bo
{ {
if (!is_object($this->categories)) if (!is_object($this->categories))
{ {
$this->categories =& CreateObject('phpgwapi.categories',$GLOBALS['egw_info']['user']['account_id'],'calendar'); $this->categories = CreateObject('phpgwapi.categories',$GLOBALS['egw_info']['user']['account_id'],'calendar');
} }
$cat_id_list = array(); $cat_id_list = array();
@ -1085,7 +1085,7 @@ class calendar_boupdate extends calendar_bo
{ {
if (!is_object($this->categories)) if (!is_object($this->categories))
{ {
$this->categories =& CreateObject('phpgwapi.categories',$GLOBALS['egw_info']['user']['account_id'],'calendar'); $this->categories = CreateObject('phpgwapi.categories',$GLOBALS['egw_info']['user']['account_id'],'calendar');
} }
if (!is_array($cat_id_list)) if (!is_array($cat_id_list))

View File

@ -14,7 +14,7 @@
/** /**
* some necessary defines used by the calendar * some necessary defines used by the calendar
*/ */
if(extension_loaded('mcal') == False) if(!extension_loaded('mcal'))
{ {
define('MCAL_RECUR_NONE',0); define('MCAL_RECUR_NONE',0);
define('MCAL_RECUR_DAILY',1); define('MCAL_RECUR_DAILY',1);
@ -162,8 +162,10 @@ class calendar_so
} }
if (!$events) return false; if (!$events) return false;
foreach ($events as $event) { foreach ($events as &$event)
if (!isset($event['uid']) || strlen($event['uid']) < $minimum_uid_length) { {
if (!isset($event['uid']) || strlen($event['uid']) < $minimum_uid_length)
{
// event (without uid), not strong enough uid => create new uid // event (without uid), not strong enough uid => create new uid
$event['uid'] = $GLOBALS['egw']->common->generate_uid('calendar',$event['id']); $event['uid'] = $GLOBALS['egw']->common->generate_uid('calendar',$event['id']);
$this->db->update($this->cal_table, array('cal_uid' => $event['uid']), $this->db->update($this->cal_table, array('cal_uid' => $event['uid']),
@ -197,7 +199,9 @@ class calendar_so
// prefix the id with the type // prefix the id with the type
$user_id = $row['cal_user_type'].$row['cal_user_id']; $user_id = $row['cal_user_type'].$row['cal_user_id'];
// and append quantity // and append quantity
$row['cal_status'] .= $row['cal_quantity'] == 1 ? '' : $row['cal_quantity']; if ($row['cal_quantity'] > 1) $row['cal_status'] .= $row['cal_quantity'];
// append role to status, if != 'REQ-PARTICIPANT'
if ($row['cal_role'] != 'REQ-PARTICIPANT') $row['cal_status'] .= $row['cal_role'];
} }
else else
{ {
@ -403,7 +407,7 @@ class calendar_so
// now ready all users with the given cal_id AND (cal_recur_date=0 or the fitting recur-date) // now ready all users with the given cal_id AND (cal_recur_date=0 or the fitting recur-date)
// This will always read the first entry of each recuring event too, we eliminate it later // This will always read the first entry of each recuring event too, we eliminate it later
$recur_dates[] = 0; $recur_dates[] = 0;
$utcal_id_view = " (select * from ".$this->user_table." where cal_id in (".implode(',',array_unique($ids)).")) utcalid "; $utcal_id_view = " (SELECT * FROM ".$this->user_table." WHERE cal_id IN (".implode(',',array_unique($ids)).")) utcalid ";
//$utrecurdate_view = " (select * from ".$this->user_table." where cal_recur_date in (".implode(',',array_unique($recur_dates)).")) utrecurdates "; //$utrecurdate_view = " (select * from ".$this->user_table." where cal_recur_date in (".implode(',',array_unique($recur_dates)).")) utrecurdates ";
foreach($this->db->select($utcal_id_view,'*',array( foreach($this->db->select($utcal_id_view,'*',array(
//'cal_id' => array_unique($ids), //'cal_id' => array_unique($ids),
@ -416,6 +420,10 @@ class calendar_so
if (!isset($events[$id])) continue; // not needed first entry of recuring event if (!isset($events[$id])) continue; // not needed first entry of recuring event
// add quantity
if ($row['cal_quantity'] > 1) $row['cal_status'] .= $row['cal_quantity'];
// append role to status, if != 'REQ-PARTICIPANT'
if ($row['cal_role'] != 'REQ-PARTICIPANT') $row['cal_status'] .= $row['cal_role'];
$events[$id]['participants'][$this->combine_user($row['cal_user_type'],$row['cal_user_id'])] = $row['cal_status']; $events[$id]['participants'][$this->combine_user($row['cal_user_type'],$row['cal_user_id'])] = $row['cal_status'];
} }
/* custom fields are not shown in the regular views, so we can ignore them here for the moment /* custom fields are not shown in the regular views, so we can ignore them here for the moment
@ -821,7 +829,7 @@ ORDER BY cal_user_type, cal_usre_id
* updates the participants of an event, taken into account the evtl. recurrences of the event(!) * updates the participants of an event, taken into account the evtl. recurrences of the event(!)
* *
* @param int $cal_id * @param int $cal_id
* @param array $participants id => status pairs * @param array $participants uid => status pairs
* @param int|boolean $change_since=0 false=new entry, > 0 time from which on the repetitions should be changed, default 0=all * @param int|boolean $change_since=0 false=new entry, > 0 time from which on the repetitions should be changed, default 0=all
* @return int|boolean number of updated recurrences or false on error * @return int|boolean number of updated recurrences or false on error
*/ */
@ -905,12 +913,18 @@ ORDER BY cal_user_type, cal_usre_id
$id = null; $id = null;
$this->split_user($uid,$type,$id); $this->split_user($uid,$type,$id);
$set = array(
'cal_status' => $status !== true ? $status[0] : 'U',
'cal_quantity' => substr($status,1) > 1 ? (int)substr($status,1) : 1,
);
// update role if set, it's apended to status and quantity
if (strlen($status) > 1 && preg_match('/^.[0-9]*(.*)$/',$status,$matches))
{
$set['cal_role'] = $matches[1];
}
foreach($recurrences as $recur_date) foreach($recurrences as $recur_date)
{ {
$this->db->insert($this->user_table,array( $this->db->insert($this->user_table,$set,array(
'cal_status' => $status !== true ? $status[0] : 'U',
'cal_quantity' => substr($status,1) ? substr($status,1) : 1,
),array(
'cal_id' => $cal_id, 'cal_id' => $cal_id,
'cal_recur_date' => $recur_date, 'cal_recur_date' => $recur_date,
'cal_user_type' => $type, 'cal_user_type' => $type,
@ -930,9 +944,10 @@ ORDER BY cal_user_type, cal_usre_id
* @param int $user_id * @param int $user_id
* @param int|char $status numeric status (defines) or 1-char code: 'R', 'U', 'T' or 'A' * @param int|char $status numeric status (defines) or 1-char code: 'R', 'U', 'T' or 'A'
* @param int $recur_date=0 date to change, or 0 = all since now * @param int $recur_date=0 date to change, or 0 = all since now
* @param string $role=null role to set if !is_null($role)
* @return int number of changed recurrences * @return int number of changed recurrences
*/ */
function set_status($cal_id,$user_type,$user_id,$status,$recur_date=0) function set_status($cal_id,$user_type,$user_id,$status,$recur_date=0,$role=null)
{ {
static $status_code_short = array( static $status_code_short = array(
REJECTED => 'R', REJECTED => 'R',
@ -966,13 +981,13 @@ ORDER BY cal_user_type, cal_usre_id
} }
else else
{ {
$this->db->insert($this->user_table,array( $set = array('cal_status' => $status);
'cal_status' => $status, if (!is_null($role)) $set['cal_role'] = $role;
),$where,__LINE__,__FILE__,'calendar'); $this->db->insert($this->user_table,$set,$where,__LINE__,__FILE__,'calendar');
} }
$ret = $this->db->affected_rows(); $ret = $this->db->affected_rows();
//error_log(__METHOD__."($cal_id,$user_type,$user_id,$status,$recur_date) = $ret"); //error_log(__METHOD__."($cal_id,$user_type,$user_id,$status,$recur_date) = $ret");
return $this->db->affected_rows(); return $ret;
} }
/** /**

View File

@ -247,7 +247,7 @@ class calendar_ui
* - filter: the used filter: all or hideprivate * - filter: the used filter: all or hideprivate
* - sortby: category or user of planner * - sortby: category or user of planner
* - view: the actual view, where dialogs should return to or which they refresh * - view: the actual view, where dialogs should return to or which they refresh
* @param set_states array to manualy set / change one of the states, default NULL = use $_REQUEST * @param array $set_states array to manualy set / change one of the states, default NULL = use $_REQUEST
*/ */
function manage_states($set_states=NULL) function manage_states($set_states=NULL)
{ {
@ -390,7 +390,7 @@ class calendar_ui
/** /**
* gets the icons displayed for a given event * gets the icons displayed for a given event
* *
* @param $event array * @param array $event
* @return array of 'img' / 'title' pairs * @return array of 'img' / 'title' pairs
*/ */
function event_icons($event) function event_icons($event)
@ -509,8 +509,8 @@ class calendar_ui
function popup($link,$target='_blank',$width=750,$height=410,$Link_confirm_abort='',$Link_confirm_text='') function popup($link,$target='_blank',$width=750,$height=410,$Link_confirm_abort='',$Link_confirm_text='')
{ {
//Handle Exception for Calandar //Handle Exception for Calandar
if (($Link_confirm_abort) && ($Link_confirm_text)) if ($Link_confirm_abort && $Link_confirm_text)
{ {
$returnvalue = 'javascript:var check=confirm(\''.$Link_confirm_text.'\');'; $returnvalue = 'javascript:var check=confirm(\''.$Link_confirm_text.'\');';
$returnvalue .=' if (check==true) {'; $returnvalue .=' if (check==true) {';
// open confirm =0kay // open confirm =0kay
@ -524,14 +524,9 @@ class calendar_ui
$returnvalue .= '}'; $returnvalue .= '}';
return $returnvalue; return $returnvalue;
}
else {
return 'egw_openWindowCentered2('.($link == 'this.href' ? $link : "'".$link."'").','.
($target == 'this.target' ? $target : "'".$target."'").",$width,$height,'yes')";
} }
return 'egw_openWindowCentered2('.($link == 'this.href' ? $link : "'".$link."'").','.
($target == 'this.target' ? $target : "'".$target."'").",$width,$height,'yes')";
} }
/** /**

View File

@ -287,7 +287,7 @@ class calendar_uiforms extends calendar_ui
{ {
$quantity = $content['participants']['quantity'] ? $content['participants']['quantity'] : 1; $quantity = $content['participants']['quantity'] ? $content['participants']['quantity'] : 1;
if ($app == "resources" && !empty($id)) { if ($app == "resources" && !empty($id)) {
$bores =& CreateObject('resources.bo_resources'); $bores = CreateObject('resources.bo_resources');
$selectedres = $bores->read($id); $selectedres = $bores->read($id);
$cats = $bores->acl->get_cats(EGW_ACL_DIRECT_BOOKING); $cats = $bores->acl->get_cats(EGW_ACL_DIRECT_BOOKING);
if (is_array($cats) && $selectedres['bookable'] == 1 && if (is_array($cats) && $selectedres['bookable'] == 1 &&
@ -749,7 +749,7 @@ class calendar_uiforms extends calendar_ui
function edit($event=null,$preserv=null,$msg='',$js = 'window.focus();',$link_to_id='') function edit($event=null,$preserv=null,$msg='',$js = 'window.focus();',$link_to_id='')
{ {
$template = $_REQUEST['print'] ? 'calendar.print' : 'calendar.edit'; $template = $_REQUEST['print'] ? 'calendar.print' : 'calendar.edit';
$etpl =& CreateObject('etemplate.etemplate',$template); $etpl = CreateObject('etemplate.etemplate',$template);
$sel_options = array( $sel_options = array(
'recur_type' => &$this->bo->recur_types, 'recur_type' => &$this->bo->recur_types,
'status' => $this->bo->verbose_status, 'status' => $this->bo->verbose_status,
@ -1106,7 +1106,7 @@ class calendar_uiforms extends calendar_ui
*/ */
function conflicts($event,$conflicts,$preserv) function conflicts($event,$conflicts,$preserv)
{ {
$etpl =& CreateObject('etemplate.etemplate','calendar.conflicts'); $etpl = CreateObject('etemplate.etemplate','calendar.conflicts');
foreach($conflicts as $k => $conflict) foreach($conflicts as $k => $conflict)
{ {
@ -1482,7 +1482,7 @@ class calendar_uiforms extends calendar_ui
/** /**
* Export events as vCalendar version 2.0 files (iCal) * Export events as vCalendar version 2.0 files (iCal)
* *
* @param int/array $content=0 numeric cal_id or submitted content from etempalte::exec * @param int|array $content=0 numeric cal_id or submitted content from etempalte::exec
* @param boolean $return_error=false should an error-msg be returned or a regular page with it generated (default) * @param boolean $return_error=false should an error-msg be returned or a regular page with it generated (default)
* @return string error-msg if $return_error * @return string error-msg if $return_error
*/ */
@ -1543,7 +1543,7 @@ class calendar_uiforms extends calendar_ui
$content['msg'] = $msg; $content['msg'] = $msg;
$GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Export'); $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Export');
$etpl =& CreateObject('etemplate.etemplate','calendar.export'); $etpl = CreateObject('etemplate.etemplate','calendar.export');
$etpl->exec('calendar.calendar_uiforms.export',$content); $etpl->exec('calendar.calendar_uiforms.export',$content);
} }
@ -1577,7 +1577,7 @@ class calendar_uiforms extends calendar_ui
'msg' => $msg, 'msg' => $msg,
); );
$GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Import'); $GLOBALS['egw_info']['flags']['app_header'] = lang('calendar') . ' - ' . lang('iCal Import');
$etpl =& CreateObject('etemplate.etemplate','calendar.import'); $etpl = CreateObject('etemplate.etemplate','calendar.import');
$etpl->exec('calendar.calendar_uiforms.import',$content); $etpl->exec('calendar.calendar_uiforms.import',$content);
} }

View File

@ -5,7 +5,7 @@
* @link http://www.egroupware.org * @link http://www.egroupware.org
* @package calendar * @package calendar
* @author Ralf Becker <RalfBecker-AT-outdoor-training.de> * @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
* @copyright (c) 2004-8 by RalfBecker-At-outdoor-training.de * @copyright (c) 2004-9 by RalfBecker-At-outdoor-training.de
* @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
* @version $Id$ * @version $Id$
*/ */
@ -161,7 +161,7 @@ class calendar_uiviews extends calendar_ui
$this->dragdrop = new dragdrop(); $this->dragdrop = new dragdrop();
// if the object would auto-disable itself unset object // if the object would auto-disable itself unset object
// to avoid unneccesary dragdrop calls later // to avoid unneccesary dragdrop calls later
if(!$this->dragdrop->validateBrowser()) { $this->dragdrop = false; } if(!$this->dragdrop->validateBrowser()) $this->dragdrop = false;
} }
} }
@ -1128,7 +1128,7 @@ class calendar_uiviews extends calendar_ui
{ {
if ($this->debug > 1 || $this->debug==='eventWidget') $this->bo->debug_message('uiviews::eventWidget(%1,width=%2)',False,$event,$width); if ($this->debug > 1 || $this->debug==='eventWidget') $this->bo->debug_message('uiviews::eventWidget(%1,width=%2)',False,$event,$width);
if($this->use_time_grid && $event['whole_day_on_top']) { $block='event_widget_wholeday_on_top'; } if($this->use_time_grid && $event['whole_day_on_top']) $block = 'event_widget_wholeday_on_top';
static $tpl = False; static $tpl = False;
if (!$tpl) if (!$tpl)
@ -1185,9 +1185,9 @@ class calendar_uiviews extends calendar_ui
{ {
$part_array[lang('Participants')][$part_key] = $participant; $part_array[lang('Participants')][$part_key] = $participant;
} }
elseif(isset($this->bo->resources[$part_key{0}])) elseif(isset($this->bo->resources[$part_key[0]]))
{ {
$part_array[((isset($this->bo->resources[$part_key{0}]['participants_header'])) ? $this->bo->resources[$part_key{0}]['participants_header'] : lang($this->bo->resources[$part_key{0}]['app']))][$part_key] = $participant; $part_array[((isset($this->bo->resources[$part_key[0]]['participants_header'])) ? $this->bo->resources[$part_key[0]]['participants_header'] : lang($this->bo->resources[$part_key[0]]['app']))][$part_key] = $participant;
} }
} }
foreach($part_array as $part_group => $participant) foreach($part_array as $part_group => $participant)

View File

@ -10,7 +10,7 @@
*/ */
$setup_info['calendar']['name'] = 'calendar'; $setup_info['calendar']['name'] = 'calendar';
$setup_info['calendar']['version'] = '1.7.001'; $setup_info['calendar']['version'] = '1.7.002';
$setup_info['calendar']['app_order'] = 3; $setup_info['calendar']['app_order'] = 3;
$setup_info['calendar']['enable'] = 1; $setup_info['calendar']['enable'] = 1;
$setup_info['calendar']['index'] = 'calendar.calendar_uiviews.index'; $setup_info['calendar']['index'] = 'calendar.calendar_uiviews.index';
@ -60,3 +60,4 @@ $setup_info['calendar']['check_install'] = array(
), ),
); );

View File

@ -73,7 +73,8 @@ $phpgw_baseline = array(
'cal_user_type' => array('type' => 'varchar','precision' => '1','nullable' => False,'default' => 'u'), 'cal_user_type' => array('type' => 'varchar','precision' => '1','nullable' => False,'default' => 'u'),
'cal_user_id' => array('type' => 'varchar','precision' => '128','nullable' => False), 'cal_user_id' => array('type' => 'varchar','precision' => '128','nullable' => False),
'cal_status' => array('type' => 'char','precision' => '1','default' => 'A'), 'cal_status' => array('type' => 'char','precision' => '1','default' => 'A'),
'cal_quantity' => array('type' => 'int','precision' => '4','default' => '1') 'cal_quantity' => array('type' => 'int','precision' => '4','default' => '1'),
'cal_role' => array('type' => 'varchar','precision' => '64','default' => 'REQ-PARTICIPANT')
), ),
'pk' => array('cal_id','cal_recur_date','cal_user_type','cal_user_id'), 'pk' => array('cal_id','cal_recur_date','cal_user_type','cal_user_id'),
'fk' => array(), 'fk' => array(),

View File

@ -1691,3 +1691,15 @@ function calendar_upgrade1_6()
return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.001'; return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.001';
} }
function calendar_upgrade1_7_001()
{
$GLOBALS['egw_setup']->oProc->AddColumn('egw_cal_user','cal_role',array(
'type' => 'varchar',
'precision' => '64',
'default' => 'REQ-PARTICIPANT'
));
return $GLOBALS['setup_info']['calendar']['currentver'] = '1.7.002';
}