--- loncom/interface/lonannounce.pm 2005/11/22 16:16:53 1.38
+++ loncom/interface/lonannounce.pm 2006/05/12 02:17:50 1.52
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Announce
#
-# $Id: lonannounce.pm,v 1.38 2005/11/22 16:16:53 albertel Exp $
+# $Id: lonannounce.pm,v 1.52 2006/05/12 02:17:50 www Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -33,6 +33,7 @@ use Apache::Constants qw(:common);
use Apache::loncommon;
use Apache::lonhtmlcommon();
use Apache::lonlocal;
+use Apache::lonnavmaps();
use Apache::lonrss();
use Apache::lonnet;
use HTML::Entities();
@@ -63,7 +64,7 @@ $help
$lt{'end'}: | $enddateform |
-
+
ENDFORM
}
@@ -74,12 +75,15 @@ sub readcalendar {
my $coursedom=$env{'course.'.$courseid.'.domain'};
my %thiscal=&Apache::lonnet::dump('calendar',$coursedom,$coursenum);
my %returnhash=();
- foreach (keys %thiscal) {
- unless (($_=~/^error\:/) || ($thiscal{$_}=~/^error\:/)) {
- $returnhash{$courseid.'@'.$_}=$thiscal{$_};
+ foreach my $item (keys(%thiscal)) {
+ unless (($item=~/^error\:/) || ($thiscal{$item}=~/^error\:/)) {
+ $returnhash{$courseid.'@'.$item}=$thiscal{$item};
}
}
+
if ($courseid eq $env{'request.course.id'}) {
+ my $can_see_hidden = $env{'request.role.adv'};
+ my $navmap = Apache::lonnavmaps::navmap->new();
my %resourcedata=
&Apache::lonnet::dump('resourcedata',$coursedom,$coursenum);
foreach my $thiskey (sort keys %resourcedata) {
@@ -101,8 +105,23 @@ sub readcalendar {
$middle=~s/\.$//;
my $realm=&mt('All Resources');
if ($middle=~/^(.+)\_\_\_\(all\)$/) {
- $realm=&mt('Folder/Map').': '.&Apache::lonnet::gettitle($1);
+ my $map_url=$1;
+ if (!$can_see_hidden && !$navmap) {
+ next;
+ }
+ if (!$can_see_hidden) {
+ my $res = $navmap->getResourceByUrl($map_url);
+ if ($res && $res->randomout()) { next; }
+ }
+ $realm=&mt('Folder/Map').': '.&Apache::lonnet::gettitle($map_url);
} elsif ($middle) {
+ if (!$can_see_hidden && !$navmap) {
+ next;
+ }
+ if (!$can_see_hidden) {
+ my $res = $navmap->getBySymb($middle);
+ if ($res && $res->randomout()) { next; }
+ }
$realm=&mt('Resource').': '.&Apache::lonnet::gettitle($middle);
}
my $datetype='';
@@ -136,17 +155,17 @@ sub readcalendar {
}
sub emptycell {
- return ' | ';
+ return ' | ';
}
sub normalcell {
my ($day,$month,$year,$text)=@_;
- my $output='';
- foreach (split(/\_\_\_\&\&\&\_\_\_/,$text)) {
- if ($_) {
+ my $output;
+ my @items=&order($text);
+ foreach my $item (@items) {
+ if ($item) {
my $internalflag=0;
- my ($courseid,$start,$end,@msg)=split(/\@/,$_);
- my $msg=join('@',@msg);
+ my ($courseid,$start,$end,$msg)=split(/\@/,$item,4);
if ($msg=~/INTERNAL\:/) {
$msg=~s/INTERNAL\://gs;
$internalflag=1;
@@ -170,24 +189,26 @@ sub normalcell {
$fullmsg=~s/[\n\r]/\\n/gs;
$fullmsg=&HTML::Entities::encode($fullmsg,'<>&"\'');
$fullmsg=~s/&/\\&/g;
+ my $short_msg = substr($msg,0,20).((length($msg) > 20)?'...':'');
+ if (defined($output)) { $output.='
'; }
$output.=''.
- substr($msg,0,20).'...
';
+ $short_msg.'';
}
}
- return ''.&tfont(''.&picklink($day,$day,$month,$year).' '.$output).' | ';
+ ($year eq $todayhash{'year'}))?'_current':'').
+ '" >'.&picklink($day,$day,$month,$year).'
'.$output.'';
}
sub plaincell {
my ($text)=@_;
- my $output='';
- foreach (split(/\_\_\_\&\&\&\_\_\_/,$text)) {
- if ($_) {
- my ($courseid,$start,$end,@msg)=split(/\@/,$_);
- my $msg=join('@',@msg);
+ my $output;
+ my @items=&order($text);
+ foreach my $item (@items) {
+ if ($item) {
+ my ($courseid,$start,$end,$msg)=split(/\@/,$item,4);
my $fullmsg=&mt('Calendar Announcement for ').$env{'course.'.$courseid.'.description'}.
'\n'.&Apache::lonlocal::locallocaltime($start);
if ($start!=$end) {
@@ -198,8 +219,10 @@ sub plaincell {
$fullmsg=~s/[\n\r]/\\n/gs;
$fullmsg=&HTML::Entities::encode($fullmsg,'<>&"\'');
$fullmsg=~s/&/\\&/g;
+ my $short_msg = substr($msg,0,80).((length($msg) > 80)?'...':'');
+ if (defined($output)) { $output.='
'; }
$output.=''.
- substr($msg,0,80).'...
';
+ $short_msg.'';
}
}
return $output;
@@ -208,10 +231,10 @@ sub plaincell {
sub listcell {
my ($text)=@_;
my $output='';
- foreach (split(/\_\_\_\&\&\&\_\_\_/,$text)) {
- if ($_) {
- my ($courseid,$start,$end,@msg)=split(/\@/,$_);
- my $msg=join('@',@msg);
+ my @items=&order($text);
+ foreach my $item (@items) {
+ if ($item) {
+ my ($courseid,$start,$end,$msg)=split(/\@/,$item,4);
$msg=~s/INTERNAL\://gs;
my $fullmsg=&Apache::lonlocal::locallocaltime($start);
if ($start!=$end) {
@@ -226,6 +249,19 @@ sub listcell {
return $output;
}
+sub order {
+ my ($text)=@_;
+ my @items = split(/___&&&___/,$text);
+ sort {
+ my (undef,$astart,$aend)=split(/\@/,$a);
+ my (undef,$bstart,$bend)=split(/\@/,$b);
+ if ($astart != $bstart) {
+ return $astart <=> $bstart;
+ }
+ return $aend <=> $bend;
+ } @items;
+}
+
sub nextday {
my %th=@_;
$th{'day'}++;
@@ -242,11 +278,11 @@ sub showday {
$tk-=$oneday;
$nextday+=$oneday;
}
- foreach (keys %allcal) {
- my ($course,$startdate,$enddate)=($_=~/^(\w+)\@(\d+)\_(\d+)$/);
- if (($startdate<$nextday) && ($enddate>$tk)) {
+ foreach my $item (keys(%allcal)) {
+ my ($course,$startdate,$enddate)=($item=~/^(\w+)\@(\d+)\_(\d+)$/);
+ if (($startdate<$nextday) && ($enddate>=$tk)) {
$outp.='___&&&___'.$course.'@'.$startdate.'@'.$enddate.'@'.
- $allcal{$_};
+ $allcal{$item};
}
}
unless ($mode) {
@@ -263,15 +299,6 @@ sub showday {
}
}
-sub tfont {
- my $text=shift;
- if ($env{'form.pickdate'} eq 'yes') {
- return ''.$text.'';
- } else {
- return $text;
- }
-}
-
sub picklink {
my ($text,$day,$month,$year)=@_;
if ($env{'form.pickdate'} eq 'yes') {
@@ -299,9 +326,43 @@ function dialin(day,month,year) {
ENDDIA
}
+# ----------------------------------------------------- Summarize all calendars
+sub get_all_calendars {
+ my %allcal=();
+ foreach my $course (sort(&Apache::loncommon::findallcourses())) {
+ %allcal=(%allcal,&readcalendar($course));
+ }
+ return %allcal;
+}
+
+sub output_ics_file {
+ my ($r)=@_;
+# RFC 2445 wants CRLF
+ my $crlf="\015\012";
+# Header
+ $r->print("BEGIN:VCALENDAR$crlf");
+ $r->print("VERSION:2.0$crlf");
+ $r->print("PRODID:-//LONCAPA//LONCAPA Calendar Output//EN$crlf");
+ my %allcal=&get_all_calendars();
+ foreach my $event (keys(%allcal)) {
+ my ($course,$startdate,$enddate)=($event=~/^(\w+)\@(\d+)\_(\d+)$/);
+ $r->print("BEGIN:VEVENT$crlf");
+ $r->print("DTSTART:".&Apache::loncommon::utc_string($startdate).$crlf);
+ $r->print("DTEND:".&Apache::loncommon::utc_string($enddate).$crlf);
+ $r->print("SUMMARY:$allcal{$event}$crlf");
+ $r->print("END:VEVENT$crlf");
+ }
+# Footer
+ $r->print("END:VCALENDAR$crlf");
+}
sub handler {
my $r = shift;
+ if ($r->uri=~/\.(ics|ical)$/) {
+ &Apache::loncommon::content_type($r,'text/calendar');
+ &output_ics_file($r);
+ return OK;
+ }
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
return OK if $r->header_only;
@@ -310,8 +371,7 @@ sub handler {
my $today=time;
%todayhash=&Apache::loncommon::timehash($today);
# ----------------------------------------------------------------- Check marks
- %showedcheck=();
- undef %showedcheck;
+ undef(%showedcheck);
# ---------------------------------------------------------- Get month and year
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
['month','year','pickdate','formname','element']);
@@ -334,12 +394,8 @@ sub handler {
'dlsav' => -1 ));
my $weekday=$firstday{'weekday'};
# ------------------------------------------------------------ Print the screen
- my $html=&Apache::lonxml::xmlbegin();
- $r->print(<
-The LearningOnline Network with CAPA
-
-
ENDDOCUMENT
+
if ($pickdatemode) {
# no big header in pickdate mode
- $r->print(&Apache::loncommon::bodytag("Pick a Date",'','',1).
+ $r->print(&Apache::loncommon::start_page("Pick a Date",$js,
+ {'only_body' => 1,}).
&dialscript().
'');
} else {
- $r->print(&Apache::loncommon::bodytag("Announcements and Calendar"));
+ $r->print(&Apache::loncommon::start_page("Announcements and Calendar",
+ $js));
}
# does this user have privileges to post, etc?
my $allowed=0;
@@ -382,8 +440,8 @@ ENDDOCUMENT
# ------------------------------------------------------------ Process commands
if ($serverpost) {
if ($env{'form.serveraction'}) {
- foreach (keys %env) {
- if ($_=~/^form\.postto\_(\w+)/) {
+ foreach my $key (keys(%env)) {
+ if ($key=~/^form\.postto\_(\w+)/) {
$r->print(
'
Posting '.$1.': '.&Apache::lonnet::postannounce
($1,$env{'form.serverannnounce'}));
@@ -399,11 +457,11 @@ Post announcements to the system login a
Check machines:
SERVERANNOUNCE
# list servers
- foreach (sort keys %Apache::lonnet::hostname) {
- if (&Apache::lonnet::allowed('psa',$Apache::lonnet::hostdom{$_})) {
- $r->print ('
'.
- $_.' '.$Apache::lonnet::hostname{$_}.' '.
- ' '.
+ $host.' '.$Apache::lonnet::hostname{$host}.' '.
+ 'current');
}
}
@@ -440,8 +498,8 @@ SERVERANNOUNCE
# ---------------------------------------------------------------- Remove items
if ($env{'form.action'} eq 'del') {
my @delwhich=();
- foreach (keys %env) {
- if ($_=~/^form\.remove\_(.+)$/) {
+ foreach my $key (keys(%env)) {
+ if ($key=~/^form\.remove\_(.+)$/) {
push(@delwhich,$1);
}
}
@@ -455,11 +513,7 @@ SERVERANNOUNCE
&editfield($r,$today,$tomorrow,'');
}
# ----------------------------------------------------- Summarize all calendars
- my %allcal=();
- foreach (&Apache::loncommon::findallcourses()) {
- %allcal=(%allcal,&readcalendar($_));
- }
-
+ my %allcal=&get_all_calendars();
# ------------------------------- Initialize table and forward backward buttons
my ($pm,$py,$fm,$fy)=($month-1,$year,$month+1,$year);
if ($pm<1) { ($pm,$py)=(12,$year-1); }
@@ -475,9 +529,15 @@ SERVERANNOUNCE
if (($year<1970) || ($year>2037)) {
$r->print('No calendar available for this date.
'.
'Current Month