Make calendar-query report work with bound collections.

This commit is contained in:
Andrew McMillan 2010-03-15 23:55:29 +13:00
parent 76d411a6ab
commit 961d1c494a
3 changed files with 244 additions and 5 deletions

View File

@ -257,6 +257,14 @@ function BuildSqlFilter( $filter ) {
*/
$responses = array();
$collection = new DAVResource($request->path);
$bound_from = $collection->bound_from();
if ( !$collection->Exists() ) {
$request->DoResponse( 404 );
}
if ( ! ($collection->IsCalendar() || $collection->IsSchedulingCollection()) ) {
$request->DoResponse( 403, translate('The calendar-query report must be run against a collection') );
}
/**
* @todo Once we are past DB version 1.2.1 we can change this query more radically. The best performance to
@ -266,16 +274,16 @@ $responses = array();
* AND caldav_data.caldav_type = 'VEVENT' ORDER BY caldav_data.user_no, caldav_data.dav_name;
*/
$where = " WHERE caldav_data.user_no = $request->user_no AND caldav_data.dav_name ~ ".qpg("^".$request->path)." ";
$where = " WHERE caldav_data.collection_id = " . $collection->resource_id();
if ( is_array($qry_filters) ) {
dbg_log_array( "calquery", "qry_filters", $qry_filters, true );
$where .= BuildSqlFilter( $qry_filters );
}
if ( ! $request->AllowedTo('all') ) {
if ( $collection->Privileges() != privilege_to_bits('DAV::all') ) {
$where .= "AND (calendar_item.class != 'PRIVATE' OR calendar_item.class IS NULL) ";
}
if ( isset($c->hide_TODO) && $c->hide_TODO && ! $request->AllowedTo('all') ) {
if ( isset($c->hide_TODO) && $c->hide_TODO && ! $collection->HavePrivilegeTo('DAV::write-content') ) {
$where .= "AND caldav_data.caldav_type NOT IN ('VTODO') ";
}
@ -285,10 +293,13 @@ if ( isset($c->hide_older_than) && intval($c->hide_older_than > 0) ) {
$sql = "SELECT * FROM caldav_data INNER JOIN calendar_item USING(dav_id,user_no,dav_name)". $where;
if ( isset($c->strict_result_ordering) && $c->strict_result_ordering ) $sql .= " ORDER BY dav_id";
$qry = new PgQuery( $sql );
if ( $qry->Exec("calquery",__LINE__,__FILE__) && $qry->rows > 0 ) {
$qry = new AwlQuery( $sql );
if ( $qry->Exec("calquery",__LINE__,__FILE__) && $qry->rows() > 0 ) {
while( $calendar_object = $qry->Fetch() ) {
if ( !$need_post_filter || apply_filter( $qry_filters, $calendar_object ) ) {
if ( $bound_from != $collection->dav_name() ) {
$calendar_object->dav_name = str_replace( $bound_from, $collection->dav_name(), $calendar_object->dav_name);
}
if ( $need_expansion ) {
$ics = new iCalComponent($calendar_object->caldav_data);
$expanded = expand_event_instances($ics, $expand_range_start, $expand_range_end);

View File

@ -0,0 +1,199 @@
<?xml version="1.0" encoding="utf-8" ?>
<multistatus xmlns="DAV:" xmlns:C="urn:ietf:params:xml:ns:caldav">
<response>
<href>/caldav.php/user4/user2/33169d69-2969-4a96-a3e1-2e312b7614e6.ics</href>
<propstat>
<prop>
<C:calendar-data>BEGIN:VCALENDAR
PRODID:-//davical.org//NONSGML AWL Calendar//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081020T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081021T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081022T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081023T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081024T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081027T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081028T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081029T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081030T110000Z
DURATION:PT30M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054958Z
LAST-MODIFIED:20081023T055044Z
DTSTAMP:20081023T054958Z
UID:33169d69-2969-4a96-a3e1-2e312b7614e6
SUMMARY:Daily Action Meeting
RRULE:FREQ=DAILY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR
X-MOZ-GENERATION:2
DTSTART:20081031T110000Z
DURATION:PT30M
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user4/user2/047871e3-6b70-4178-9af8-0ceb50f7b092.ics</href>
<propstat>
<prop>
<C:calendar-data>BEGIN:VCALENDAR
PRODID:-//davical.org//NONSGML AWL Calendar//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
CREATED:20081023T054934Z
LAST-MODIFIED:20081023T055059Z
DTSTAMP:20081023T054934Z
UID:047871e3-6b70-4178-9af8-0ceb50f7b092
SUMMARY:Weekly Project Meeting
RRULE:FREQ=WEEKLY;INTERVAL=1
X-MOZ-GENERATION:2
DTSTART:20081020T090000Z
DURATION:PT60M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T054934Z
LAST-MODIFIED:20081023T055059Z
DTSTAMP:20081023T054934Z
UID:047871e3-6b70-4178-9af8-0ceb50f7b092
SUMMARY:Weekly Project Meeting
RRULE:FREQ=WEEKLY;INTERVAL=1
X-MOZ-GENERATION:2
DTSTART:20081027T090000Z
DURATION:PT60M
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
<response>
<href>/caldav.php/user4/user2/9429a973-2b13-4b1a-be09-948d75425c45.ics</href>
<propstat>
<prop>
<C:calendar-data>BEGIN:VCALENDAR
PRODID:-//davical.org//NONSGML AWL Calendar//EN
VERSION:2.0
CALSCALE:GREGORIAN
BEGIN:VEVENT
CREATED:20081023T055115Z
LAST-MODIFIED:20081023T055139Z
DTSTAMP:20081023T055115Z
UID:9429a973-2b13-4b1a-be09-948d75425c45
SUMMARY:Weekly catch-up
RRULE:FREQ=WEEKLY;INTERVAL=1
X-MOZ-GENERATION:2
DTSTART:20081024T140000Z
DURATION:PT60M
END:VEVENT
BEGIN:VEVENT
CREATED:20081023T055115Z
LAST-MODIFIED:20081023T055139Z
DTSTAMP:20081023T055115Z
UID:9429a973-2b13-4b1a-be09-948d75425c45
SUMMARY:Weekly catch-up
RRULE:FREQ=WEEKLY;INTERVAL=1
X-MOZ-GENERATION:2
DTSTART:20081031T140000Z
DURATION:PT60M
END:VEVENT
END:VCALENDAR
</C:calendar-data>
</prop>
<status>HTTP/1.1 200 OK</status>
</propstat>
</response>
</multistatus>

View File

@ -0,0 +1,29 @@
#
# Test REPORT access to a bound calendar using a ticket.
#
TYPE=REPORT
URL=http://regression.host/caldav.php/user4/user2/
AUTH=user4:user4
HEADER=User-Agent: DAViCalTester/public
HEADER=Content-Type: text/xml; charset="UTF-8"
BEGINDATA
<?xml version="1.0" encoding="UTF-8"?>
<calendar-query xmlns:D="DAV:" xmlns="urn:ietf:params:xml:ns:caldav">
<D:prop>
<calendar-data>
<expand start="20081001T000000Z" end="20081101T000000Z"/>
</calendar-data>
</D:prop>
<filter>
<comp-filter name="VCALENDAR">
<comp-filter name="VEVENT">
<time-range start="20081001T000000Z" end="20081101T000000Z"/>
</comp-filter>
</comp-filter>
</filter>
</calendar-query>
ENDDATA