From 8e90d1af9718521350ec5cd0df780f06dc2e56e6 Mon Sep 17 00:00:00 2001 From: Andrew McMillan Date: Tue, 13 Feb 2007 14:51:54 +1300 Subject: [PATCH] Some tidying of the freebusy report. Allow specification of start/finish range on the freebusy GET query particularly to enable reliable regression test results. --- inc/caldav-REPORT.php | 27 ++++++++++++++--------- inc/freebusy-GET.php | 51 +++++++++++++++++++++++++++++++------------ 2 files changed, 54 insertions(+), 24 deletions(-) diff --git a/inc/caldav-REPORT.php b/inc/caldav-REPORT.php index acaf0711..b8618563 100644 --- a/inc/caldav-REPORT.php +++ b/inc/caldav-REPORT.php @@ -236,26 +236,33 @@ if ( $free_busy_query ) { } $where .= "AND caldav_data.caldav_type IN ( 'VEVENT', 'VFREEBUSY' ) "; $where .= "AND (calendar_item.transp != 'TRANSPARENT' OR calendar_item.transp IS NULL) "; -// $where .= "AND (calendar_item.status != 'CANCELLED' OR calendar_item.status IS NULL) "; + $where .= "AND (calendar_item.status != 'CANCELLED' OR calendar_item.status IS NULL) "; $where .= "AND (calendar_item.class != 'PRIVATE' OR calendar_item.class IS NULL OR get_permissions($session->user_no,caldav_data.user_no) ~ 'A') "; // Must have 'all' permissions to see confidential items $busy = array(); $busy_tentative = array(); - $sql = "SELECT caldav_data.caldav_data, calendar_item.rrule, "; + $sql = "SELECT caldav_data.caldav_data, calendar_item.rrule, calendar_item.transp, calendar_item.status, "; $sql .= "to_char(calendar_item.dtstart at time zone 'GMT',".iCalendar::SqlDateFormat().") AS start, "; $sql .= "to_char(calendar_item.dtend at time zone 'GMT',".iCalendar::SqlDateFormat().") AS finish "; $sql .= "FROM caldav_data INNER JOIN calendar_item USING(user_no, dav_name)".$where." ORDER BY dtstart, dtend"; $qry = new PgQuery( $sql, "^".$request->path.$request->DepthRegexTail() ); if ( $qry->Exec("REPORT",__LINE__,__FILE__) && $qry->rows > 0 ) { while( $calendar_object = $qry->Fetch() ) { - if ( ! preg_match( '/^TRANSP.*TRANSPARENT/im', $calendar_object->caldav_data ) ) { - if ( preg_match( '/^STATUS.*:.*TENTATIVE/im', $calendar_object->caldav_data ) ) { - dbg_error_log( "REPORT", " FreeBusy: tentative appointment: %s, %s", $calendar_object->start, $calendar_object->finish ); - $busy_tentative[] = $calendar_object; - } - else if ( ! preg_match( '/STATUS.*:.*CANCELLED/m', $calendar_object->caldav_data ) ) { - dbg_error_log( "REPORT", " FreeBusy: Not transparent, tentative or cancelled: %s, %s", $calendar_object->start, $calendar_object->finish ); - $busy[] = $calendar_object; + if ( $calendar_object->transp != "TRANSPARENT" ) { + switch ( $calendar_object->status ) { + case "TENTATIVE": + dbg_error_log( "REPORT", " FreeBusy: tentative appointment: %s, %s", $calendar_object->start, $calendar_object->finish ); + $busy_tentative[] = $calendar_object; + break; + + case "CANCELLED": + // Cancelled events are ignored + break; + + default: + dbg_error_log( "REPORT", " FreeBusy: Not transparent, tentative or cancelled: %s, %s", $calendar_object->start, $calendar_object->finish ); + $busy[] = $calendar_object; + break; } } } diff --git a/inc/freebusy-GET.php b/inc/freebusy-GET.php index 5b580c9f..99fe5977 100644 --- a/inc/freebusy-GET.php +++ b/inc/freebusy-GET.php @@ -2,8 +2,24 @@ require_once("iCalendar.php"); include_once("RRule.php"); -$start = date( "Ymd\THis", time() - (86400 * 30) ); -$finish = date( "Ymd\THis", time() + (86400 * 200) ); +/** +* We need to allow GET of start & finish so we can have a consistent regression test result set. And it might be useful +* to people as well... +*/ +if ( isset($_GET['start']) && preg_match( '/^[12][0-9]{3}(0[0-9]|1[012])[0123][0-9]T[0-2][0-9]([0-5][0-9]){2}$/', $_GET['start'] )) { + $start = $_GET['start']; +} +else { + $start = date( "Ymd\THis", time() - (86400 * 30) ); +} +if ( isset($_GET['finish']) && preg_match( '/^[12][0-9]{3}(0[0-9]|1[012])[0123][0-9]T[0-2][0-9]([0-5][0-9]){2}$/', $_GET['finish'] )) { + $finish = $_GET['finish']; +} +else { + $finish = date( "Ymd\THis", time() + (86400 * 200) ); +} + + if ( isset($request->by_email) ) { $where = "WHERE caldav_data.user_no = $request->user_no "; } @@ -13,13 +29,13 @@ else { $where .= "AND (dtend >= '$start'::timestamp with time zone OR calculate_later_timestamp('$start'::timestamp with time zone,dtend,rrule) >= '$start'::timestamp with time zone) "; $where .= "AND dtstart <= '$finish'::timestamp with time zone "; $where .= "AND caldav_data.caldav_type IN ( 'VEVENT', 'VFREEBUSY' ) "; - $where .= "AND (calendar_item.transp != 'TRANSPARENT' OR calendar_item.transp IS NULL) "; -// $where .= "AND (calendar_item.status != 'CANCELLED' OR calendar_item.status IS NULL) "; -$where .= "AND (calendar_item.class != 'PRIVATE' OR calendar_item.class IS NULL OR get_permissions($session->user_no,caldav_data.user_no) ~ 'A') "; // Must have 'all' permissions to see confidential items +$where .= "AND (calendar_item.transp != 'TRANSPARENT' OR calendar_item.transp IS NULL) "; +$where .= "AND (calendar_item.status != 'CANCELLED' OR calendar_item.status IS NULL) "; +$where .= "AND (calendar_item.class != 'PRIVATE' OR calendar_item.class IS NULL OR get_permissions($session->user_no,caldav_data.user_no) ~ 'A') "; // Must have 'all' permissions to see confidential items $busy = array(); $busy_tentative = array(); -$sql = "SELECT caldav_data.caldav_data, calendar_item.rrule, "; +$sql = "SELECT caldav_data.caldav_data, calendar_item.rrule, calendar_item.transp, calendar_item.status, "; $sql .= "to_char(calendar_item.dtstart at time zone 'GMT',".iCalendar::SqlDateFormat().") AS start, "; $sql .= "to_char(calendar_item.dtend at time zone 'GMT',".iCalendar::SqlDateFormat().") AS finish "; $sql .= "FROM caldav_data INNER JOIN calendar_item USING(user_no, dav_name) $where ORDER BY dtstart, dtend"; @@ -27,14 +43,21 @@ $sql .= "FROM caldav_data INNER JOIN calendar_item USING(user_no, dav_name) $whe $qry = new PgQuery( $sql ); if ( $qry->Exec("freebusy",__LINE__,__FILE__) && $qry->rows > 0 ) { while( $calendar_object = $qry->Fetch() ) { - if ( ! preg_match( '/^TRANSP.*TRANSPARENT/im', $calendar_object->caldav_data ) ) { - if ( preg_match( '/^STATUS.*:.*TENTATIVE/im', $calendar_object->caldav_data ) ) { - dbg_error_log( "freebusy", " FreeBusy: tentative appointment: %s, %s", $calendar_object->start, $calendar_object->finish ); - $busy_tentative[] = $calendar_object; - } - else if ( ! preg_match( '/STATUS.*:.*CANCELLED/m', $calendar_object->caldav_data ) ) { - dbg_error_log( "freebusy", " FreeBusy: Not transparent, tentative or cancelled: %s, %s", $calendar_object->start, $calendar_object->finish ); - $busy[] = $calendar_object; + if ( $calendar_object->transp != "TRANSPARENT" ) { + switch ( $calendar_object->status ) { + case "TENTATIVE": + dbg_error_log( "REPORT", " FreeBusy: tentative appointment: %s, %s", $calendar_object->start, $calendar_object->finish ); + $busy_tentative[] = $calendar_object; + break; + + case "CANCELLED": + // Cancelled events are ignored + break; + + default: + dbg_error_log( "REPORT", " FreeBusy: Not transparent, tentative or cancelled: %s, %s", $calendar_object->start, $calendar_object->finish ); + $busy[] = $calendar_object; + break; } } }