--- loncom/interface/lonnavmaps.pm 2006/03/02 19:45:22 1.365 +++ loncom/interface/lonnavmaps.pm 2006/03/17 21:33:17 1.372 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Navigate Maps Handler # -# $Id: lonnavmaps.pm,v 1.365 2006/03/02 19:45:22 albertel Exp $ +# $Id: lonnavmaps.pm,v 1.372 2006/03/17 21:33:17 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -194,10 +194,7 @@ MENU MENU } $r->send_http_header; - my $html=&Apache::lonxml::xmlbegin(); - $r->print(<<"ENDSUBM"); - $html - + my $js =<<"ENDSUBM"; - - - ENDSUBM + $r->print(&Apache::lonxml::xmlbegin(). + &Apache::loncommon::head(undef,$js). + ''. + &Apache::loncommon::end_page(undef,$js)); + return OK; } if ($ENV{QUERY_STRING} =~ /^launchExternal/) { @@ -239,9 +238,7 @@ MENU return HTTP_NOT_ACCEPTABLE; } $r->send_http_header; - my $html=&Apache::lonxml::xmlbegin(); - $r->print("$html\n"); - $r->print("".&mt('Navigate Course Contents').""); + # ------------------------------------------------------------ Get query string &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['register','sort','showOnlyHomework','postsymb']); @@ -249,12 +246,13 @@ MENU my $addentries=''; my $more_unload; my $body_only=''; + my $js; if ($env{'environment.remotenavmap'} eq 'on') { - $r->print(''); + $js=''; # FIXME need to be smarter to only catch window close events # $more_unload="collapse()" $body_only=1; @@ -269,7 +267,8 @@ MENU } # Header - $r->print(''. + $r->print(&Apache::lonxml::xmlbegin(). + &Apache::loncommon::head('Navigate Course Contents',$js). &Apache::loncommon::bodytag('Navigate Course Contents','', $addentries,$body_only,'', $env{'form.register'})); @@ -281,7 +280,7 @@ MENU if (!($navmap->courseMapDefined())) { $r->print(&Apache::loncommon::help_open_menu('','Navigation Screen','Navigation_Screen','',undef,'RAT')); $r->print('Coursemap undefined.' . - ''); + &Apache::loncommon::end_page()); return OK; } @@ -434,7 +433,7 @@ MENU #my $td=&tv_interval($t0); #$r->print("
$td"); - $r->print(""); + $r->print(&Apache::loncommon::end_page()); $r->rflush(); return OK; @@ -2271,16 +2270,18 @@ sub get_user_data { sub get_discussion_data { my $self = shift; if ($self->{RETRIEVED_DISCUSSION_DATA}) { - return $self->{DISCUSSION_DATA}; + return $self->{DISCUSSION_DATA}; } - + + $self->generate_email_discuss_status(); + my $cid=$env{'request.course.id'}; my $cdom=$env{'course.'.$cid.'.domain'}; my $cnum=$env{'course.'.$cid.'.num'}; - # Retrieve discussion data for resources in course - my %discussion_data = &Apache::lonnet::dump($cid,$cdom,$cnum); - + my %discussion_data = &Apache::lonnet::dumpstore($cid,$cdom,$cnum); + + $self->{DISCUSSION_DATA} = \%discussion_data; $self->{RETRIEVED_DISCUSSION_DATA} = 1; return $self->{DISCUSSION_DATA}; @@ -2342,6 +2343,62 @@ sub hasDiscussion { } } +sub last_post_time { + my $self = shift; + my $symb = shift; + my $ressymb = $self->wrap_symb($symb); + return $self->{DISCUSSION_TIME}->{$ressymb}; +} + +sub unread_discussion { + my $self = shift; + my $symb = shift; + + $self->get_discussion_data(); + + my $ressymb = $self->wrap_symb($symb); + # keys used to store bulletinboard postings use 'unwrapped' symb. + my $discsymb = $self->unwrap_symb($ressymb); + my $version = $self->{DISCUSSION_DATA}{'version:'.$discsymb}; + if (!$version) { return; } + + my $prevread = $self->{LAST_READ}{$ressymb}; + + my $unreadcount = 0; + my $hiddenflag = 0; + my $deletedflag = 0; + my ($hidden,$deleted); + + my %subjects; + + for (my $id=$version; $id>0; $id--) { + my $vkeys=$self->{DISCUSSION_DATA}{$id.':keys:'.$discsymb}; + my @keys=split(/:/,$vkeys); + if (grep(/^hidden$/ ,@keys)) { + if (!$hiddenflag) { + $hidden = $self->{DISCUSSION_DATA}{$id.':'.$discsymb.':hidden'}; + $hiddenflag = 1; + } + } elsif (grep(/^deleted$/,@keys)) { + if (!$deletedflag) { + $deleted = $self->{DISCUSSION_DATA}{$id.':'.$discsymb.':deleted'}; + $deletedflag = 1; + } + } else { + if (($hidden !~/\.$id\./) && ($deleted !~/\.$id\./) + && $prevread < $self->{DISCUSSION_DATA}{$id.':'.$discsymb.':timestamp'}) { + $unreadcount++; + $subjects{$unreadcount}= + $id.': '.$self->{DISCUSSION_DATA}{$id.':'.$discsymb.':subject'}; + } + } + } + if (wantarray) { + return ($unreadcount,\%subjects); + } + return $unreadcount +} + sub wrap_symb { my $self = shift; my $symb = shift; @@ -2353,6 +2410,16 @@ sub wrap_symb { return $symb; } +sub unwrap_symb { + my $self = shift; + my $ressymb = shift; + my $discsymb = $ressymb; + if ($ressymb =~ m-^(bulletin___\d+___)adm/wrapper/(adm/\w+/\w+/\d+/bulletinboard)$-) { + $discsymb = $1.$2; + } + return $discsymb; +} + # Private method: Does the given resource (as a symb string) have # current feedback? Returns the string in the feedback hash, which # will be false if it does not exist. @@ -3600,8 +3667,7 @@ sub kind { my $self=shift; return $self- sub randomout { my $self=shift; return $self->navHash("randomout_", 1); } sub randompick { my $self = shift; - return $self->{NAV_MAP}->{PARM_HASH}->{$self->symb . - '.0.parameter_randompick'}; + return $self->parmval('randompick'); } sub link { my $self=shift; @@ -3719,6 +3785,16 @@ sub retrieveResources { return $self->{NAV_MAP}->retrieveResources(@_); } +sub is_exam { + my ($self,$part) = @_; + if ($self->parmval('type',$part) eq 'exam') { + return 1; + } + if ($self->src() =~ /\.(exam)$/) { + return 1; + } + return 0; +} sub is_html { my $self=shift; my $src = $self->src(); @@ -4061,6 +4137,19 @@ Returns a false value if there has been logged in, true if there has. Always returns false if the discussion data was not extracted when the nav map was constructed. +=item * B: + +Returns a false value if there hasn't been discussion otherwise returns +unix timestamp of last time a discussion posting (or edit) was made. + +=item * B: + +returns in scalar context the count of the number of unread discussion +postings + +returns in list context both the count of postings and a hash ref +containing the subjects of all unread postings + =item * B: Gets the feedback for the resource and returns the raw feedback string @@ -4081,6 +4170,16 @@ sub hasDiscussion { return $self->{NAV_MAP}->hasDiscussion($self->symb()); } +sub last_post_time { + my $self = shift; + return $self->{NAV_MAP}->last_post_time($self->symb()); +} + +sub unread_discussion { + my $self = shift; + return $self->{NAV_MAP}->unread_discussion($self->symb()); +} + sub getFeedback { my $self = shift; my $source = $self->src(); @@ -4178,7 +4277,7 @@ sub countResponses { sub responseTypes { my $self = shift; my %responses; - foreach my $part ($self->parts()) { + foreach my $part (@{$self->parts()}) { foreach my $responsetype ($self->responseType($part)) { $responses{$responsetype}++ if (defined($responsetype)); }