re-added freebusy support to the calendar

This commit is contained in:
Ralf Becker 2006-07-14 23:24:56 +00:00
parent 9ae99b8003
commit 77678259e8
4 changed files with 119 additions and 31 deletions

View File

@ -12,7 +12,7 @@
/* $Id$ */
$GLOBALS['phpgw_info'] = array(
$GLOBALS['egw_info'] = array(
'flags' => array(
'currentapp' => 'calendar',
'noheader' => True,
@ -20,46 +20,51 @@
),
);
// check if we are loged in, by checking sessionid and kp3, as the sessionid get set automaticaly by php for php4-sessions
$sessionid = isset($_COOKIE['sessionid']) ? $_COOKIE['sessionid'] : @$_GET['sessionid'];
$kp3 = isset($_COOKIE['kp3']) ? $_COOKIE['kp3'] : @$_GET['kp3'];
if (!($loged_in = $sessionid && $kp3))
if (!($loged_in = @$_REQUEST['sessionid'] && @$_REQUEST['kp3']))
{
$GLOBALS['phpgw_info']['flags']['currentapp'] = 'login';
$GLOBALS['phpgw_info']['flags']['noapi'] = True;
$GLOBALS['egw_info']['flags']['currentapp'] = 'login';
$GLOBALS['egw_info']['flags']['noapi'] = True;
}
include ('../header.inc.php');
function fail_exit($msg)
{
echo "<html>\n<head>\n<title>$msg</title>\n<meta http-equiv=\"content-type\" content=\"text/html; charset=".
$GLOBALS['phpgw']->translation->charset()."\" />\n</head>\n<body><h1>$msg</h1>\n</body>\n</html>\n";
$GLOBALS['egw']->translation->charset()."\" />\n</head>\n<body><h1>$msg</h1>\n</body>\n</html>\n";
$GLOBALS['phpgw']->common->phpgw_exit();
$GLOBALS['egw']->common->egw_exit();
}
if (!$loged_in)
{
include ('../phpgwapi/inc/functions.inc.php');
$GLOBALS['phpgw_info']['flags']['currentapp'] = 'calendar';
$GLOBALS['egw_info']['flags']['currentapp'] = 'calendar';
}
$user = is_numeric($_GET['user']) ? (int) $_GET['user'] : $GLOBALS['phpgw']->accounts->name2id($_GET['user']);
$user = is_numeric($_GET['user']) ? (int) $_GET['user'] : $GLOBALS['egw']->accounts->name2id($_GET['user'],'account_lid','u');
if (!($username = $GLOBALS['phpgw']->accounts->id2name($user)))
if (!($username = $GLOBALS['egw']->accounts->id2name($user)))
{
fail_exit(lang("freebusy: Unknow user '%1', wrong password or not availible to not loged in users !!!",$_GET['user']));
fail_exit(lang("freebusy: Unknow user '%1', wrong password or not availible to not loged in users !!!"." $username($user)",$_GET['user']));
}
if (!$loged_in)
{
$GLOBALS['phpgw']->preferences->account_id = $user;
$GLOBALS['phpgw_info']['user']['preferences'] = $GLOBALS['phpgw']->preferences->read_repository();
$GLOBALS['phpgw_info']['user']['account_id'] = $user;
$GLOBALS['phpgw_info']['user']['account_lid'] = $username;
$GLOBALS['egw']->preferences->account_id = $user;
$GLOBALS['egw_info']['user']['preferences'] = $GLOBALS['egw']->preferences->read_repository();
$GLOBALS['egw_info']['user']['account_id'] = $user;
$GLOBALS['egw_info']['user']['account_lid'] = $username;
$cal_prefs = &$GLOBALS['phpgw_info']['user']['preferences']['calendar'];
$cal_prefs = &$GLOBALS['egw_info']['user']['preferences']['calendar'];
if (!$cal_prefs['freebusy'] || !empty($cal_prefs['freebusy_pw']) && $cal_prefs['freebusy_pw'] != $_GET['password'])
{
fail_exit(lang("freebusy: Unknow user '%1', wrong password or not availible to not loged in users !!!",$_GET['user']));
}
}
ExecMethod('calendar.boicalendar.freebusy');
if ($_GET['debug'])
{
echo "<pre>";
}
else
{
ExecMethod2('phpgwapi.browser.content_header','freebusy.ifb','text/calendar');
}
echo ExecMethod2('calendar.boical.freebusy',$user,$_GET['end']);

View File

@ -1685,6 +1685,22 @@ class bocal
$GLOBALS['egw']->preferences->save_repository(False,'default');
}
}
/**
* Get the freebusy URL of a user
*
* @param int/string $user account_id or account_lid
* @param string $pw=null password
*/
function freebusy_url($user,$pw=null)
{
if (is_numeric($user)) $user = $GLOBALS['egw']->accounts->id2name($user);
return (!$GLOBALS['egw_info']['server']['webserver_url'] || $GLOBALS['egw_info']['server']['webserver_url']{0} == '/' ?
($_SERVER['HTTPS'] ? 'https://' : 'http://').$_SERVER['HTTP_HOST'] : '').
$GLOBALS['egw_info']['server']['webserver_url'].'/calendar/freebusy.php?user='.urlencode($user).
($pw ? '&password='.urlencode($pw) : '');
}
}
if (!function_exists('array_intersect_key')) // php5.1 function

View File

@ -74,7 +74,7 @@
0 => 0, // undefined
9 => 1, 8 => 1, 7 => 1, 6 => 1, // low
5 => 2, // normal
4 => 3, 3 => 3, 2 => 3, 1 => 3, // high
4 => 3, 2 => 3, 3 => 3, 1 => 3, // high
);
/**
@ -98,6 +98,14 @@
MCAL_RECUR_MONTHLY_WDAY => 'MP', // BYDAY={1..5}{MO..SO}
MCAL_RECUR_YEARLY => 'YM',
);
/**
* manufacturer and name of the sync-client
*
* @var string
*/
var $productManufacturer = 'file';
var $productName = '';
/**
* Exports one calendar event to an iCalendar item
@ -318,7 +326,7 @@
}
$attributes['UID'] = $eventGUID;
foreach($attributes as $key => $value)
{
foreach(is_array($value) ? $value : array($value) as $valueID => $valueData)
@ -673,6 +681,10 @@
function setSupportedFields($_productManufacturer='file', $_productName='')
{
// save them vor later use
$this->productManufacturere = $_productManufacturer;
$this->productName = $_productName;
$defaultFields = array('public' => 'public', 'description' => 'description', 'end' => 'end',
'start' => 'start', 'location' => 'location', 'recur_type' => 'recur_type',
'recur_interval' => 'recur_interval', 'recur_data' => 'recur_data', 'recur_enddate' => 'recur_enddate',
@ -904,7 +916,14 @@
$vcardData['non_blocking'] = $attributes['value'] == 'TRANSPARENT';
break;
case 'PRIORITY':
$vcardData['priority'] = (int) $this->priority_ical2egw[$attributes['value']];
if ($this->productManufacturer == 'nexthaus corporation')
{
$vcardData['priority'] = $attributes['value'] == 1 ? 3 : 2; // 1=high, 2=normal
}
else
{
$vcardData['priority'] = (int) $this->priority_ical2egw[$attributes['value']];
}
break;
case 'CATEGORIES':
$vcardData['category'] = array();
@ -1036,5 +1055,57 @@
}
return false;
}
/**
* Create a freebusy vCal for the given user(s)
*
* @param int $user account_id
* @param mixed $end=null end-date, default now+1 month
* @return string
*/
function freebusy($user,$end=null)
{
if (!$end) $end = $this->now_su + 100*DAY_s; // default next 100 days
$vcal = &new Horde_iCalendar;
$vcal->setAttribute('PRODID','-//eGroupWare//NONSGML eGroupWare Calendar '.$GLOBALS['egw_info']['apps']['calendar']['version'].'//'.
strtoupper($GLOBALS['egw_info']['user']['preferences']['common']['lang']));
$vcal->setAttribute('VERSION','2.0');
$vfreebusy = Horde_iCalendar::newComponent('VFREEBUSY',$vcal);
$parameters = array(
'ORGANIZER' => $GLOBALS['egw']->translation->convert(
$GLOBALS['egw']->accounts->id2name($user,'account_firstname').' '.
$GLOBALS['egw']->accounts->id2name($user,'account_lastname'),
$GLOBALS['egw']->translation->charset(),'utf-8'),
);
foreach(array(
'URL' => $this->freebusy_url($user),
'DTSTART' => $this->date2ts($this->now_su,true), // true = server-time
'DTEND' => $this->date2ts($end,true), // true = server-time
'ORGANIZER' => $GLOBALS['egw']->accounts->id2name($user,'account_email'),
'DTSTAMP' => time(),
) as $attr => $value)
{
$vfreebusy->setAttribute($attr, $value, $parameters[$name]);
}
foreach(parent::search(array(
'start' => $this->now_su,
'end' => $end,
'users' => $user,
'date_format' => 'server',
'show_rejected' => false,
)) as $event)
{
if ($event['non_blocking']) continue;
$vfreebusy->setAttribute('FREEBUSY',array(array(
'start' => $event['start'],
'end' => $event['end'],
)));
}
$vcal->addComponent($vfreebusy);
return $vcal->exportvCalendar();
}
}
?>

View File

@ -15,7 +15,8 @@
/* $Id$ */
ExecMethod('calendar.bocal.check_set_default_prefs');
$bocal =& CreateObject('calendar.bocal');
$bocal->check_set_default_prefs();
$default = array(
'day' => lang('Dayview'),
@ -121,11 +122,7 @@
// 'private+group' => lang('private and group public'),
// 'public+group' => lang('global public and group public')
);
$freebusy_url = $GLOBALS['egw_info']['server']['webserver_url'].'/calendar/freebusy.php?user='.$GLOBALS['egw_info']['user']['account_lid'].'&password='.$GLOBALS['egw_info']['user']['preferences']['calendar']['freebusy_pw'];
if ($freebusy_url[0] == '/')
{
$freebusy_url = ($_SERVER['HTTPS'] ? 'https://' : 'http://').$_SERVER['HTTP_HOST'].$freebusy_url;
}
$freebusy_url = $bocal->freebusy_url($GLOBALS['egw_info']['user']['account_lid'],$GLOBALS['egw_info']['user']['preferences']['calendar']['freebusy_pw']);
$freebusy_help = lang('Should not loged in persons be able to see your freebusy information? You can set an extra password, different from your normal password, to protect this informations. The freebusy information is in iCal format and only include the times when you are busy. It does not include the event-name, description or locations. The URL to your freebusy information is %1.','<a href="'.$freebusy_url.'" target="_blank">'.$freebusy_url.'</a>');
$GLOBALS['settings'] = array(
@ -329,7 +326,7 @@
'xmlrpc' => True,
'admin' => False
),
/* disabled free/busy stuff til it gets rewritten with new Horde iCal classes -- RalfBecker 2006/03/03
// disabled free/busy stuff til it gets rewritten with new Horde iCal classes -- RalfBecker 2006/03/03
'freebusy' => array(
'type' => 'check',
'label' => 'Make freebusy information available to not loged in persons?',
@ -349,5 +346,4 @@
'xmlrpc' => True,
'admin' => False
)
*/
);