diff options
author | ivan <ivan> | 2009-12-31 13:16:41 +0000 |
---|---|---|
committer | ivan <ivan> | 2009-12-31 13:16:41 +0000 |
commit | b4b0c7e72d7eaee2fbfc7022022c9698323203dd (patch) | |
tree | ba4cd21399e412c32fe3737eaa8478e3271509f9 /rt/share/html/NoAuth/iCal/dhandler | |
parent | 2dfda73eeb3eae2d4f894099754794ef07d060dd (diff) |
import rt 3.8.7
Diffstat (limited to 'rt/share/html/NoAuth/iCal/dhandler')
-rw-r--r-- | rt/share/html/NoAuth/iCal/dhandler | 122 |
1 files changed, 122 insertions, 0 deletions
diff --git a/rt/share/html/NoAuth/iCal/dhandler b/rt/share/html/NoAuth/iCal/dhandler new file mode 100644 index 000000000..0eeeb20b1 --- /dev/null +++ b/rt/share/html/NoAuth/iCal/dhandler @@ -0,0 +1,122 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC +%# <jesse@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +%# 02110-1301 or visit their web page on the internet at +%# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%init> +use Data::ICal; +use Data::ICal::Entry::Event; +use Encode (); + +my $path = $m->dhandler_arg; + +my $notfound = sub { + $r->headers_out->{'Status'} = '404 Not Found'; + $m->clear_and_abort; +}; + +$notfound->() unless $path =~ m!^([^/]+)/([^/]+)/(.*)(\.(ical|ics))?!; + +my ($name, $auth, $search) = ($1, $2, $3); +# Unescape parts +$_ =~ s/\%([0-9a-z]{2})/chr(hex($1))/gei for $name, $search; +# convert to perl strings +$_ = Encode::decode_utf8( $_ ) for $name, $search; + +my $user = RT::User->new( $RT::SystemUser ); +$user->Load( $name ); +$notfound->() unless $user->id; + +$notfound->() unless $user->ValidateAuthString( $auth, $search ); + +my $cu = RT::CurrentUser->new; +$cu->Load($user); +my $tickets = RT::Tickets->new( $cu ); +$tickets->FromSQL($search); + +$r->headers_out->{'Content-Type'} = 'text/calendar; charset=utf-8'; + +my $feed = Data::ICal->new(); +$feed->add_properties('x-wr-calname' => ["RT due dates" => {value => "TEXT"}]); +$feed->add_properties('x-wr-caldesc' => ["Due dates for RT tickets: $search" => {value => "TEXT"}]); +$feed->add_properties('calscale' => ['gregorian']); +$feed->add_properties('method' => ['publish']); +$feed->add_properties('prodid' => ["-//" . RT->Config->Get('rtname') ."//"]); + +while (my $t = $tickets->Next) { + next unless $t->DueObj->Unix > 0; + + my $starttime = $t->StartsObj->Unix > 0 ? $t->StartsObj : $t->CreatedObj; + + my $now = RT::Date->new( $cu ); $now->SetToNow; + my $start = Data::ICal::Entry::Event->new; + my $end = Data::ICal::Entry::Event->new; + $_->add_properties( + url => RT->Config->Get('WebURL') . "?q=".$t->id, + organizer => $t->OwnerObj->Name, + dtstamp => $now->iCal, + created => $t->CreatedObj->iCal, + 'last-modified' => $t->LastUpdatedObj->iCal, + ) for $start, $end; + + $start->add_properties( + summary => "Start: ".$t->Subject, + dtstart => [$starttime->iCal( Time => 0 ) => { value => 'DATE' }], + dtend => [$starttime->iCal( Time => 0 ) => { value => 'DATE'}], + ); + $end->add_properties( + summary => "Due: ".$t->Subject, + dtstart => [$t->DueObj->iCal( Time => 0 ) => { value => 'DATE' }], + dtend => [$t->DueObj->iCal( Time => 0 ) => { value => 'DATE' }], + ); + + $feed->add_entry($start); + $feed->add_entry($end); +} + +$m->clear_buffer; +$m->out($feed->as_string); +$m->abort; +</%init> |