--- loncom/interface/lonnavmaps.pm 2006/02/10 22:33:45 1.359
+++ loncom/interface/lonnavmaps.pm 2006/03/04 05:55:43 1.366
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Navigate Maps Handler
#
-# $Id: lonnavmaps.pm,v 1.359 2006/02/10 22:33:45 albertel Exp $
+# $Id: lonnavmaps.pm,v 1.366 2006/03/04 05:55:43 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -1095,7 +1095,7 @@ sub render_resource {
if ($resource->is_problem()) {
if ($part eq '0' || $params->{'condensed'}) {
- $icon ='
';
+ $icon ='
';
} else {
$icon = $params->{'indentString'};
}
@@ -1112,11 +1112,12 @@ sub render_resource {
}
my $folderType = $resource->is_sequence() ? 'folder' : 'page';
-
+ my $title=$resource->title;
+ $title=~s/\"/\"/g;
if (!$params->{'resource_no_folder_link'}) {
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') . '.gif';
- $icon = "
";
+ $icon = "
";
$linkopen = "{'url'} . '?' .
$params->{'queryString'} . '&filter=';
@@ -1134,8 +1135,8 @@ sub render_resource {
# Don't allow users to manipulate folder
$icon = "navmap.$folderType." . ($nowOpen ? 'closed' : 'open') .
'.nomanip.gif';
- $icon = "
";
+ $icon = "
";
$linkopen = "";
$linkclose = "";
@@ -1143,10 +1144,10 @@ sub render_resource {
}
if ($resource->randomout()) {
- $nonLinkedText .= ' (hidden) ';
+ $nonLinkedText .= ' ('.&mt('hidden').') ';
}
if (!$resource->condval()) {
- $nonLinkedText .= ' (conditionally hidden) ';
+ $nonLinkedText .= ' ('.&mt('conditionally hidden').') ';
}
# We're done preparing and finally ready to start the rendering
@@ -1178,13 +1179,13 @@ sub render_resource {
if ($resource->is_problem() && $part ne '0' &&
!$params->{'condensed'}) {
my $displaypart=$resource->part_display($part);
- $partLabel = " (Part: $displaypart)";
+ $partLabel = " (".&mt('Part: [_1]', $displaypart).")";
if ($link!~/\#/) { $link.='#'.&Apache::lonnet::escape($part); }
$title = "";
}
if ($params->{'condensed'} && $resource->countParts() > 1) {
- $nonLinkedText .= ' (' . $resource->countParts() . ' parts)';
+ $nonLinkedText .= ' ('.&mt('[_1] parts', $resource->countParts()).')';
}
my $target;
@@ -1472,8 +1473,8 @@ sub render {
$navmap = Apache::lonnavmaps::navmap->new();
if (!defined($navmap)) {
# no londer in course
- return 'No course selected
- Select a course
';
+ return ''.&mt('No course selected').'
+ '.&mt('Select a course').'
';
}
}
@@ -2270,16 +2271,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);
-
+
+
$self->{DISCUSSION_DATA} = \%discussion_data;
$self->{RETRIEVED_DISCUSSION_DATA} = 1;
return $self->{DISCUSSION_DATA};
@@ -2341,6 +2344,61 @@ 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);
+
+ my $version = $self->{DISCUSSION_DATA}{'version:'.$ressymb};
+ 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:'.$ressymb};
+ my @keys=split(/:/,$vkeys);
+ if (grep(/^hidden$/ ,@keys)) {
+ if (!$hiddenflag) {
+ $hidden = $self->{DISCUSSION_DATA}{$id.':'.$ressymb.':hidden'};
+ $hiddenflag = 1;
+ }
+ } elsif (grep(/^deleted$/,@keys)) {
+ if (!$deletedflag) {
+ $deleted = $self->{DISCUSSION_DATA}{$id.':'.$ressymb.':deleted'};
+ $deletedflag = 1;
+ }
+ } else {
+ if (($hidden !~/\.$id\./) && ($deleted !~/\.$id\./)
+ && $prevread < $self->{DISCUSSION_DATA}{$id.':'.$ressymb.':timestamp'}) {
+ $unreadcount++;
+ $subjects{$unreadcount}=
+ $id.': '.$self->{DISCUSSION_DATA}{$id.':'.$ressymb.':subject'};
+ }
+ }
+ }
+ if (wantarray) {
+ return ($unreadcount,\%subjects);
+ }
+ return $unreadcount
+}
+
sub wrap_symb {
my $self = shift;
my $symb = shift;
@@ -2755,7 +2813,7 @@ sub usedVersion {
1;
package Apache::lonnavmaps::iterator;
-use WeakRef;
+use Scalar::Util qw(weaken);
use Apache::lonnet;
=pod
@@ -3236,7 +3294,7 @@ sub populateStack {
1;
package Apache::lonnavmaps::DFSiterator;
-use WeakRef;
+use Scalar::Util qw(weaken);
use Apache::lonnet;
# Not documented in the perldoc: This is a simple iterator that just walks
@@ -3420,7 +3478,7 @@ sub populateStack {
1;
package Apache::lonnavmaps::resource;
-use WeakRef;
+use Scalar::Util qw(weaken);
use Apache::lonnet;
=pod
@@ -3730,10 +3788,21 @@ sub is_page {
return $self->navHash("is_map_", 1) &&
$self->navHash("map_type_" . $self->map_pc()) eq 'page';
}
+sub is_practice {
+ my $self=shift;
+ my ($part) = @_;
+ if ($self->parmval('type',$part) eq 'practice') {
+ return 1;
+ }
+ return 0;
+}
sub is_problem {
my $self=shift;
my $src = $self->src();
- return ($src =~ /\.(problem|exam|quiz|assess|survey|form|library|task)$/)
+ if ($src =~ /\.(problem|exam|quiz|assess|survey|form|library|task)$/) {
+ return !($self->is_practice());
+ }
+ return 0;
}
sub contains_problem {
my $self=shift;
@@ -3760,6 +3829,11 @@ sub is_survey {
}
return 0;
}
+sub is_task {
+ my $self=shift;
+ my $src = $self->src();
+ return ($src =~ /\.(task)$/)
+}
sub is_empty_sequence {
my $self=shift;
@@ -4044,6 +4118,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
@@ -4064,6 +4151,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();
@@ -4273,7 +4370,8 @@ sub extractParts {
# where the part names begin and end, and even then, it is possible
# to construct ambiguous situations.
foreach (split /,/, $metadata) {
- if ($_ =~ /^([a-zA-Z]+)response_(.*)/) {
+ if ($_ =~ /^([a-zA-Z]+)response_(.*)/
+ || $_ =~ /^(Task)_(.*)/) {
my $responseType = $1;
my $partStuff = $2;
my $partIdSoFar = '';