--- loncom/interface/lonfeedback.pm 2004/07/27 14:29:03 1.99.2.2
+++ loncom/interface/lonfeedback.pm 2004/08/01 16:05:14 1.111
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Feedback
#
-# $Id: lonfeedback.pm,v 1.99.2.2 2004/07/27 14:29:03 albertel Exp $
+# $Id: lonfeedback.pm,v 1.111 2004/08/01 16:05:14 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,6 +36,7 @@ use Apache::loncommon();
use Apache::lontexconvert();
use Apache::lonlocal; # must not have ()
use Apache::lonhtmlcommon();
+use Apache::lonspeller();
sub discussion_open {
my ($status)=@_;
@@ -64,7 +65,6 @@ sub discussion_visible {
sub list_discussion {
my ($mode,$status,$symb)=@_;
-
my $outputtarget=$ENV{'form.grade_target'};
if (not &discussion_visible($status)) { return ''; }
my @bgcols = ("#cccccc","#eeeeee");
@@ -72,6 +72,7 @@ sub list_discussion {
if ($mode eq 'board') { $discussiononly=1; }
unless ($ENV{'request.course.id'}) { return ''; }
my $crs='/'.$ENV{'request.course.id'};
+ my $cid=$ENV{'request.course.id'};
if ($ENV{'request.course.sec'}) {
$crs.='_'.$ENV{'request.course.sec'};
}
@@ -80,7 +81,9 @@ sub list_discussion {
$symb=&Apache::lonnet::symbread();
}
unless ($symb) { return ''; }
-
+ my %usernamesort = ();
+ my %namesort =();
+ my %subjectsort = ();
# backward compatibility (bulletin boards used to be 'wrapped')
my $ressymb=$symb;
if ($mode eq 'board') {
@@ -92,19 +95,31 @@ sub list_discussion {
# Get discussion display settings for this discussion
my $lastkey = $ressymb.'_lastread';
my $showkey = $ressymb.'_showonlyunread';
+ my $markkey = $ressymb.'_showonlyunmark',
my $visitkey = $ressymb.'_visit';
my $ondispkey = $ressymb.'_markondisp';
- my %dischash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$lastkey,$showkey,$visitkey,$ondispkey],$ENV{'user.domain'},$ENV{'user.name'});
+ my $userpickkey = $ressymb.'_userpick';
+ my $toggkey = $ressymb.'_readtoggle';
+ my $readkey = $ressymb.'_read';
+
+ my %dischash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$lastkey,$showkey,$markkey,$visitkey,$ondispkey,$userpickkey,$toggkey,$readkey],$ENV{'user.domain'},$ENV{'user.name'});
my %discinfo = ();
my $showonlyunread = 0;
+ my $showunmark = 0;
my $markondisp = 0;
my $prevread = 0;
my $previous = 0;
my $visit = 0;
my $newpostsflag = 0;
+ my @posters = split/\&/,$dischash{$userpickkey};
# Retain identification of "NEW" posts identified in last display, if continuing 'previous' browsing of posts.
- &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['previous']);
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['previous','sortposts','rolefilter','statusfilter','sectionpick','totposters']);
+ my $sortposts = $ENV{'form.sortposts'};
+ my $rolefilter = $ENV{'form.rolefilter'};
+ my $statusfilter = $ENV{'form.statusfilter'};
+ my $sectionpick = $ENV{'form.sectionpick'};
+ my $totposters = $ENV{'form.totposters'};
$previous = $ENV{'form.previous'};
if ($previous > 0) {
$prevread = $previous;
@@ -114,6 +129,34 @@ sub list_discussion {
}
}
+# Get information about students and non-students in course for filtering display of posts
+ my %roleshash = ();
+ my %roleinfo = ();
+ if ($rolefilter) {
+ %roleshash = &Apache::lonnet::dump('nohist_userroles',$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},$ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ foreach (keys %roleshash) {
+ my ($role,$uname,$udom,$sec) = split/:/,$_;
+ my ($end,$start) = split/:/,$roleshash{$_};
+ my $now = time;
+ my $status = 'Active';
+ if (($now < $start) || ($end > 0 && $now > $end)) {
+ $status = 'Expired';
+ }
+ push @{$roleinfo{$uname.':'.$udom}}, $role.':'.$sec.':'.$status;
+ }
+ my ($classlist) = &Apache::loncoursedata::get_classlist(
+ $ENV{'request.course.id'},
+ $ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
+ $ENV{'course.'.$ENV{'request.course.id'}.'.num'});
+ my $sec_index = &Apache::loncoursedata::CL_SECTION();
+ my $status_index = &Apache::loncoursedata::CL_STATUS();
+ while (my ($student,$data) = each %$classlist) {
+ my ($section,$status) = ($data->[$sec_index],
+ $data->[$status_index]);
+ push @{$roleinfo{$student}}, 'st:'.$section.':'.$status;
+ }
+ }
+
# Get discussion display default settings for user
my %userenv = &Apache::lonnet::get('environment',['discdisplay','discmarkread'],$ENV{'user.domain'},$ENV{'user.name'});
my $discdisplay=$userenv{'discdisplay'};
@@ -137,6 +180,10 @@ sub list_discussion {
$showonlyunread = $dischash{$showkey};
}
+ if (defined($dischash{$markkey})) {
+ $showunmark = $dischash{$markkey};
+ }
+
if (defined($dischash{$visitkey})) {
$visit = $dischash{$visitkey};
}
@@ -146,6 +193,8 @@ sub list_discussion {
my $viewgrades=(&Apache::lonnet::allowed('vgr',$crs)
&& ($symb=~/\.(problem|exam|quiz|assess|survey|form)$/));
my @discussionitems=();
+ my %shown = ();
+ my @posteridentity=();
my %contrib=&Apache::lonnet::restore($ressymb,$ENV{'request.course.id'},
$ENV{'course.'.$ENV{'request.course.id'}.'.domain'},
$ENV{'course.'.$ENV{'request.course.id'}.'.num'});
@@ -164,7 +213,7 @@ sub list_discussion {
$ENV{'environment.remote'} eq 'off' ) {
$target='target="LONcom"';
}
-
+
my $now = time;
$discinfo{$visitkey} = $visit;
@@ -182,14 +231,21 @@ sub list_discussion {
$newpostsflag = 1;
}
my $hidden=($contrib{'hidden'}=~/\.$idx\./);
+ my $studenthidden=($contrib{'studenthidden'}=~/\.$idx\./);
my $deleted=($contrib{'deleted'}=~/\.$idx\./);
my $origindex='0.';
- if (($contrib{$idx.':replyto'}) && ($ENV{'environment.threadeddiscussion'})) {
+ my $numoldver=0;
+ if ($contrib{$idx.':replyto'}) {
+ if ( (($ENV{'environment.threadeddiscussion'}) && (($sortposts eq '') || ($sortposts eq 'ascdate'))) || ($sortposts eq 'thread')) {
# this is a follow-up message
- $original[$idx]=$original[$contrib{$idx.':replyto'}];
- $depth[$idx]=$depth[$contrib{$idx.':replyto'}]+1;
- $origindex=$index[$contrib{$idx.':replyto'}];
- if ($depth[$idx]>$maxdepth) { $maxdepth=$depth[$idx]; }
+ $original[$idx]=$original[$contrib{$idx.':replyto'}];
+ $depth[$idx]=$depth[$contrib{$idx.':replyto'}]+1;
+ $origindex=$index[$contrib{$idx.':replyto'}];
+ if ($depth[$idx]>$maxdepth) { $maxdepth=$depth[$idx]; }
+ } else {
+ $original[$idx]=0;
+ $depth[$idx]=0;
+ }
} else {
# this is an original message
$original[$idx]=0;
@@ -202,26 +258,51 @@ sub list_discussion {
}
unless ((($hidden) && (!$seeid)) || ($deleted)) {
$visible++;
- my $message=$contrib{$idx.':message'};
+ if ($contrib{$idx.':history'}) {
+ if ($contrib{$idx.':history'} =~ /:/) {
+ my @oldversions = split/:/,$contrib{$idx.':history'};
+ $numoldver = @oldversions;
+ } else {
+ $numoldver = 1;
+ }
+ }
+ my ($message,$subject);
+ if ($idx > 0) {
+ if ($contrib{$idx.':message'} =~ /.*::::\Q$numoldver\E::::(.+?)$/si) {
+ $message = $1;
+ } else {
+ $message = $contrib{$idx.':message'};
+ }
+ } else {
+ $message=$contrib{$idx.':message'};
+ }
+ my $attachmenturls = $contrib{$idx.':attachmenturl'};
$message=~s/\n/\
/g;
$message=&Apache::lontexconvert::msgtexconverted($message);
- my $subject=$contrib{$idx.':subject'};
+ if ($idx > 0) {
+ if ($contrib{$idx.':subject'} =~ /.*::::\Q$numoldver\E::::(.+?)$/si) {
+ $subject = $1;
+ } else {
+ $subject = $contrib{$idx.':subject'};
+ }
+ } else {
+ $subject=$contrib{$idx.':subject'};
+ }
if (defined($subject)) {
$subject=~s/\n/\
/g;
$subject=&Apache::lontexconvert::msgtexconverted($subject);
}
- if ($contrib{$idx.':attachmenturl'}) {
- my ($fname)
- =($contrib{$idx.':attachmenturl'}=~m|/([^/]+)$|);
- &Apache::lonnet::allowuploaded('/adm/feedback',
- $contrib{$idx.':attachmenturl'});
- $message.='
'.&mt('Attachment'). - ': '. - $fname.'
'; + if ($attachmenturls) { + my @attachments = (); + my %currattach = (); + &extract_attachments($attachmenturls,$idx,$numoldver,\$message,\@attachments,\%currattach); } if ($message) { if ($hidden) { $message=''.$message.''; + if ($studenthidden) { + $message .=''.$message.''; + &Apache::lonlocal::locallocaltime($posttime).')'; + if ($dischash{$toggkey}) { + $discussionitems[$idx].='
'.$message.''; + if ($contrib{$idx.':history'}) { + my @postversions = (); + $discussionitems[$idx] .= '
'.&Apache::lontexconvert::msgtexconverted($message).''; - if ($idx > 0) { - $subject = 'Re: '.$contrib{$idx.':subject'}; + if ($ENV{'form.replydisc'}) { + if ($contrib{$idx.':history'}) { + if ($contrib{$idx.':history'} =~ /:/) { + my @oldversions = split/:/,$contrib{$idx.':history'}; + $numoldver = @oldversions; + } else { + $numoldver = 1; + } + } + my $message; + if ($idx > 0) { + if ($contrib{$idx.':message'} =~ /::::\Q$numoldver\E::::(.+?)$/si) { + $message = $1; + } else { + $message = $contrib{$idx.':message'}; + } + } else { + $message=$contrib{$idx.':message'}; + } + $message=~s/\n/\
'.&Apache::lontexconvert::msgtexconverted($message).''; + if ($idx > 0) { + if ($contrib{$idx.':subject'} =~ /::::\Q$numoldver\E::::(.+?)$/si) { + $subject = $1; + } else { + $subject = $contrib{$idx.':subject'}; + } + $subject = 'Re: '.$subject; + } + $subject = &HTML::Entities::encode($subject,'<>&"'); + } else { + $attachmenturls = $contrib{$idx.':attachmenturl'}; + if ($contrib{$idx.':message'} =~ /.*::::(\d+)::::(.*?)$/si) { + $numoldver = $1; + $comment = $2; + } else { + $comment = $contrib{$idx.':message'}; + } + $comment = &HTML::Entities::encode($comment,'<>&"'); + if ($contrib{$idx.':subject'} =~ /.*::::\d+::::(.+?)$/si) { + $subject = $1; + } else { + $subject = $contrib{$idx.':subject'}; + } + $subject = &HTML::Entities::encode($subject,'<>&"'); + if (defined($contrib{$idx.':replyto'})) { + $parentmsg = $contrib{$idx.':replyto'}; + } + unless (exists($ENV{'form.origpage'})) { + my $anonflag = 0; + if ($contrib{$idx.':anonymous'}) { + $anonflag = 1; + } + $anonscript = (<
-
+END
+ if ( ($ENV{'form.editdisc'}) || ($ENV{'form.replydisc'}) ) {
+ if ($ENV{'form.origpage'}) {
+ foreach (@currnewattach) {
+ $r->print(''."\n");
+ }
+ foreach (@currdelold) {
+ $r->print(''."\n");
+ }
+ }
+ if ($ENV{'form.editdisc'}) {
+ if ($attachmenturls) {
+ &extract_attachments($attachmenturls,$idx,$numoldver,\$attachmsg,\@attachments,\%currattach,\@currdelold);
+ $attachnum = scalar(keys %currattach);
+ foreach (keys %currattach) {
+ $r->print(''."\n");
+ }
+ }
+ }
+ } else {
+ $r->print(<