@@ -, +, @@ - Update the code to use date and time for when a loan is due - Use dt_from_string to turn a MySQL time and date into a DateTime - Add a timestamp and a UID (these were reported as necessary by a couple of iCal validators) - Remove DTEND from events, since we now have time as well as date for when a loan is due - For loans that are overdue, set the DTSTART to now(), to avoid creating calendar events in the past - Use a template to generate text strings, to make them translatable - Apply the patch - Make sure you have at least a couple of loans, including one overdue - Go to /cgi-bin/koha/opac-user.pl and click on the link labeled "Download as iCal/.ics file" - Inspect the file in a text editor and/or view the result in a calendar appplication. Make sure the data makes sense. - Sign off and go thee merrily on thine way. - Force date_due to UTC to avoid problematic timezone info like this: DTSTART:TZID=Europe/Zurich:20160724T235900 - Remove quotes from summary and description --- .../opac-tmpl/bootstrap/en/modules/opac-ics.tt | 8 +++ .../opac-tmpl/bootstrap/en/modules/opac-user.tt | 1 + opac/opac-ics.pl | 66 +++++++++++++--------- 3 files changed, 47 insertions(+), 28 deletions(-) create mode 100644 koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-ics.tt --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-ics.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-ics.tt @@ -0,0 +1,8 @@ +[%# First line will be summary, second line will be description. Avoid indenting. -%] +[%- IF overdue == 1 -%] +[% title %] is overdue +Your copy of [% title %] (barcode [% barcode %]) is overdue +[%- ELSE -%] +[% title %] is due +Your copy of [% title %] (barcode [% barcode %]) is due back at the library today +[%- END -%] --- a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt +++ a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-user.tt @@ -303,6 +303,7 @@ Using this account is not recommended because some parts of Koha will not functi [% END %] +

Download as iCal/.ics file

[% ELSE %] --- a/opac/opac-ics.pl +++ a/opac/opac-ics.pl @@ -27,19 +27,19 @@ use Data::ICal; use Data::ICal::Entry::Event; use DateTime; use DateTime::Format::ICal; -use Date::Calc qw (Parse_Date); -use DateTime; use DateTime::Event::ICal; +use URI; use C4::Auth; use C4::Koha; use C4::Circulation; use C4::Members; +use Koha::DateUtils; my $query = new CGI; my ( $template, $borrowernumber, $cookie ) = get_template_and_user( { - template_name => "opac-user.tt", + template_name => "opac-ics.tt", query => $query, type => "opac", authnotrequired => 0, @@ -55,39 +55,49 @@ my $issues = GetPendingIssues($borrowernumber); foreach my $issue ( @$issues ) { my $vevent = Data::ICal::Entry::Event->new(); - my ($year,$month,$day)=Parse_Date($issue->{'date_due'}); - ($year,$month,$day)=split /-|\/|\.|:/,$issue->{'date_due'} unless ($year && $month); -# Decode_Date_EU2($string)) - my $datestart = DateTime->new( - day => $day, - month => $month, - year => $year, - hour => 9, - minute => 0, - second => 0 - ); - my $dateend = DateTime->new( - day => $day, - month => $month, - year => $year, - hour => 10, - minute => 0, - second => 0 + my $timestamp = DateTime->now(); # Defaults to UTC + # Send some values to the template to generate summary and description + $template->param( + overdue => $issue->{'overdue'}, + title => $issue->{'title'}, + barcode => $issue->{'barcode'}, ); + # Catch the result of the template and split on newline + my ($summary,$description) = split /\n/, $template->output; + my $datestart; + if ($issue->{'overdue'} && $issue->{'overdue'} == 1) { + # Not much use adding an event in the past for a book that is overdue + # so we set datestart = now + $datestart = $timestamp; + } else { + $datestart = dt_from_string($issue->{'date_due'}); + $datestart->set_time_zone('UTC'); + } + # Create a UID that includes the issue number and the domain + my $domain = ''; + my $baseurl = C4::Context->preference('OPACBaseURL'); + if ( $baseurl ne '' ) { + my $url = URI->new($baseurl); + $domain = $url->host; + } else { + warn "Make sure the systempreference OPACBaseURL is set!"; + } + my $uid = 'issue-' . $issue->{'issue_id'} . '@' . $domain; + # Create the event $vevent->add_properties( - summary => "$issue->{'title'} Due", - description => -"Your copy of $issue->{'title'} barcode $issue->{'barcode'} is due back at the library today", - dtstart => DateTime::Format::ICal->format_datetime($datestart), - dtend => DateTime::Format::ICal->format_datetime($dateend), + summary => $summary, + description => $description, + dtstamp => DateTime::Format::ICal->format_datetime($timestamp), + dtstart => DateTime::Format::ICal->format_datetime($datestart), + uid => $uid, ); + # Add it to the calendar $calendar->add_entry($vevent); } print $query->header( - -type => 'application/octet-stream', + -type => 'application/octet-stream', -attachment => 'koha.ics' ); - print $calendar->as_string; --
You have nothing checked out