--- loncom/interface/lonfeedback.pm 2004/07/04 23:56:58 1.97
+++ loncom/interface/lonfeedback.pm 2004/07/23 19:58:40 1.104
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Feedback
#
-# $Id: lonfeedback.pm,v 1.97 2004/07/04 23:56:58 raeburn Exp $
+# $Id: lonfeedback.pm,v 1.104 2004/07/23 19:58:40 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -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') {
@@ -94,7 +97,8 @@ sub list_discussion {
my $showkey = $ressymb.'_showonlyunread';
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 %dischash = &Apache::lonnet::get('nohist_'.$ENV{'request.course.id'}.'_discuss',[$lastkey,$showkey,$visitkey,$ondispkey,$userpickkey],$ENV{'user.domain'},$ENV{'user.name'});
my %discinfo = ();
my $showonlyunread = 0;
my $markondisp = 0;
@@ -102,9 +106,15 @@ sub list_discussion {
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 +124,34 @@ sub list_discussion {
}
}
+# Get information about students and non-stundents 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'};
@@ -146,6 +184,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'});
@@ -182,14 +222,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,13 +249,21 @@ sub list_discussion {
}
unless ((($hidden) && (!$seeid)) || ($deleted)) {
$visible++;
+ if ($contrib{$idx.':history'}) {
+ if ($contrib{$idx.':history'} =~ /:/) {
+ my @oldversions = split/:/,$contrib{$idx.':history'};
+ $numoldver = @oldversions;
+ } else {
+ $numoldver = 1;
+ }
+ }
my $message=$contrib{$idx.':message'};
$message=~s/\n/\
/g;
- $message=&Apache::lontexconvert::msgtexconverted($message);
+ $message=&Apache::lontexconvert::msgtexconverted($message,undef,$numoldver);
my $subject=$contrib{$idx.':subject'};
if (defined($subject)) {
$subject=~s/\n/\
/g;
- $subject=&Apache::lontexconvert::msgtexconverted($subject);
+ $subject=&Apache::lontexconvert::msgtexconverted($subject,undef,$numoldver);
}
if ($contrib{$idx.':attachmenturl'}) {
my ($fname)
@@ -222,6 +277,9 @@ sub list_discussion {
if ($message) {
if ($hidden) {
$message=''.$message.'';
+ if ($studenthidden) {
+ $message .='
Deleted by poster (student).';
+ }
}
my $screenname=&Apache::loncommon::screenname(
$contrib{$idx.':sendername'},
@@ -231,6 +289,20 @@ sub list_discussion {
$contrib{$idx.':senderdomain'});
my $sender=&mt('Anonymous');
+# Set up for sorting by subject
+ if ($contrib{$idx.':subject'} eq '') {
+ if (defined($subjectsort{'__No subject'})) {
+ push @{$subjectsort{'__No subject'}}, $idx;
+ } else {
+ @{$subjectsort{'__No subject'}} = ("$idx");
+ }
+ } else {
+ if (defined($subjectsort{$contrib{$idx.':subject'}})) {
+ push @{$subjectsort{$contrib{$idx.':subject'}}}, $idx;
+ } else {
+ @{$subjectsort{$contrib{$idx.':subject'}}} = ("$idx");
+ }
+ }
if ((!$contrib{$idx.':anonymous'}) || ($seeid)) {
$sender=&Apache::loncommon::aboutmewrapper(
$plainname,
@@ -242,14 +314,57 @@ sub list_discussion {
$sender.=' ['.&mt('anonymous').'] '.
$screenname;
}
- if ($seeid) {
- if ($hidden) {
- $sender.=' '.&mt('Make Visible').'';
+ $sender .= '" '.$target.'>'.&mt('Edit').''; unless ($seeid) {
+ $sender.=" ';
+ }
+ }
+ }
+ if ($seeid) {
+ if ($hidden) {
+ unless ($studenthidden) {
+ $sender.=' '.&mt('Make Visible').'';
+ }
} else {
$sender.=' '.&mt('Hide').'';
}
$sender.=' '.&mt('Delete').'';
+ $ressymb.':::'.$idx;
+ if ($newpostsflag) {
+ $sender .= '&previous='.$prevread;
+ }
+ $sender .= '">'.&mt('Delete').'';
}
} else {
if ($screenname) {
$sender=''.$screenname.'';
}
+# Set up for sorting by domain, then username for anonymous
+ unless (defined($usernamesort{'__anon'})) {
+ %{$usernamesort{'__anon'}} = ();
+ }
+ if (defined($usernamesort{'__anon'}{'__anon'})) {
+ push @{$usernamesort{'__anon'}{'__anon'}}, $idx;
+ } else {
+ @{$usernamesort{'__anon'}{'__anon'}} = ("$idx");
+ }
+# Set up for sorting by last name, then first name for anonymous
+ unless (defined($namesort{'__anon'})) {
+ %{$namesort{'__anon'}} = ();
+ }
+ if (defined($namesort{'__anon'}{'__anon'})) {
+ push @{$namesort{'__anon'}{'__anon'}}, $idx;
+ } else {
+ @{$namesort{'__anon'}{'__anon'}} = ("$idx");
+ }
}
if (&discussion_open($status) &&
&Apache::lonnet::allowed('pch',
@@ -288,15 +421,63 @@ sub list_discussion {
}
#figure out at what position this needs to print
my $thisindex=$idx;
- if ($ENV{'environment.threadeddiscussion'}) {
- $thisindex=$origindex.substr('00'.$replies[$depth[$idx]],-2,2);
+ if ( (($ENV{'environment.threadeddiscussion'}) && (($sortposts eq '') || ($sortposts eq 'ascdate'))) || ($sortposts eq 'thread')) {
+ $thisindex=$origindex.substr('00'.$replies[$depth[$idx]],-2,2);
}
$alldiscussion{$thisindex}=$idx;
- $index[$idx]=$thisindex;
+ $shown{$idx} = 0;
+ $index[$idx]=$thisindex;
my $spansize = 2;
if ($showonlyunread && $prevread > $posttime) {
$notshown{$idx} = 1;
} else {
+ my $uname = $contrib{$idx.':sendername'};
+ my $udom = $contrib{$idx.':senderdomain'};
+ my $poster = $uname.':'.$udom;
+ my $rolematch = '';
+ my $skiptest = 1;
+ if ($totposters > 0) {
+ if (grep/^$poster$/,@posters) {
+ $shown{$idx} = 1;
+ }
+ } else {
+ if ($rolefilter) {
+ if ($rolefilter eq 'all') {
+ $rolematch = '([^:]+)';
+ } else {
+ $rolematch = $rolefilter;
+ $skiptest = 0;
+ }
+ }
+ if ($sectionpick) {
+ if ($sectionpick eq 'all') {
+ $rolematch .= ':([^:]*)';
+ } else {
+ $rolematch .= ':'.$sectionpick;
+ $skiptest = 0;
+ }
+ }
+ if ($statusfilter) {
+ if ($statusfilter eq 'all') {
+ $rolematch .= ':([^:]+)';
+ } else {
+ $rolematch .= ':'.$statusfilter;
+ $skiptest = 0;
+ }
+ }
+ if ($skiptest) {
+ $shown{$idx} = 1;
+ } else {
+ foreach my $role (@{$roleinfo{$poster}}) {
+ if ($role =~ m/^$rolematch$/) {
+ $shown{$idx} = 1;
+ last;
+ }
+ }
+ }
+ }
+ }
+ unless ($notshown{$idx} == 1) {
if ($prevread > 0 && $prevread <= $posttime) {
$newitem{$idx} = 1;
$discussionitems[$idx] .= '
@@ -313,6 +494,20 @@ sub list_discussion {
$sender.' '.$vgrlink.' ('.
localtime($posttime).')'.
'
'.$message.''; + if ($contrib{$idx.':history'}) { + my @postversions = (); + $discussionitems[$idx] .= '