--- loncom/interface/lonfeedback.pm 2006/06/29 21:22:09 1.205
+++ loncom/interface/lonfeedback.pm 2006/08/14 21:44:14 1.215
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Feedback
#
-# $Id: lonfeedback.pm,v 1.205 2006/06/29 21:22:09 raeburn Exp $
+# $Id: lonfeedback.pm,v 1.215 2006/08/14 21:44:14 albertel Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -42,6 +42,7 @@ use Apache::lonenc();
use Apache::lonrss();
use HTML::LCParser();
use Apache::lonspeller();
+use Apache::longroup;
use Cwd;
use lib '/home/httpd/lib/perl/';
use LONCAPA;
@@ -73,7 +74,7 @@ sub discussion_visible {
}
sub list_discussion {
- my ($mode,$status,$ressymb,$imsextras)=@_;
+ my ($mode,$status,$ressymb,$imsextras,$group)=@_;
my $outputtarget=$env{'form.grade_target'};
if (defined($env{'form.export'})) {
if($env{'form.export'}) {
@@ -86,6 +87,11 @@ sub list_discussion {
}
}
if (not &discussion_visible($status)) { return ''; }
+ if ($group ne '' && $mode eq 'board') {
+ if (&check_group_priv($group,'vgb') ne 'ok') {
+ return '';
+ }
+ }
my @bgcols = ("#cccccc","#eeeeee");
my $discussiononly=0;
if ($mode eq 'board') { $discussiononly=1; }
@@ -129,21 +135,13 @@ sub list_discussion {
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','sortposts','rolefilter','statusfilter','sectionpick','totposters']);
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['previous','sortposts','rolefilter','statusfilter','sectionpick','grouppick','totposters']);
my $sortposts = $env{'form.sortposts'};
my $statusfilter = $env{'form.statusfilter'};
- my @sectionpick = ();
- if ($env{'form.sectionpick'} =~ /,/) {
- @sectionpick = split/,/,$env{'form.sectionpick'};
- } else {
- $sectionpick[0] = $env{'form.sectionpick'};
- }
- my @rolefilter = ();
- if ($env{'form.rolefilter'} =~ /,/) {
- @rolefilter = split/,/,$env{'form.rolefilter'};
- } else {
- $rolefilter[0] = $env{'form.rolefilter'};
- }
+ my @sectionpick = split(/,/,$env{'form.sectionpick'});
+ my @grouppick = split(/,/,$env{'form.grouppick'});
+ my @rolefilter = split(/,/,$env{'form.rolefilter'});
+
my $totposters = $env{'form.totposters'};
$previous = $env{'form.previous'};
if ($previous > 0) {
@@ -154,13 +152,15 @@ sub list_discussion {
}
}
+ my $cdom = $env{'course.'.$cid.'.domain'};
+ my $cnum = $env{'course.'.$cid.'.num'};
+
# Get information about students and non-students in course for filtering display of posts
my %roleshash = ();
my %roleinfo = ();
+ my ($classgroups,$studentgroups);
if ($env{'form.rolefilter'}) {
- %roleshash = &Apache::lonnet::dump('nohist_userroles',
- $env{'course.'.$cid.'.domain'},
- $env{'course.'.$cid.'.num'});
+ %roleshash = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum);
foreach (keys %roleshash) {
my ($role,$uname,$udom,$sec) = split/:/,$_;
if ($role =~ /^cr/) {
@@ -176,9 +176,8 @@ sub list_discussion {
push @{$roleinfo{$uname.':'.$udom}}, $role.':'.$sec.':'.$status;
}
}
- my ($classlist) = &Apache::loncoursedata::get_classlist(
- $env{'course.'.$cid.'.domain'},
- $env{'course.'.$cid.'.num'});
+ my ($classlist,$keylist) =
+ &Apache::loncoursedata::get_classlist($cdom,$cnum);
my $sec_index = &Apache::loncoursedata::CL_SECTION();
my $status_index = &Apache::loncoursedata::CL_STATUS();
while (my ($student,$data) = each %$classlist) {
@@ -186,6 +185,9 @@ sub list_discussion {
$data->[$status_index]);
push @{$roleinfo{$student}}, 'st:'.$section.':'.$status;
}
+ ($classgroups,$studentgroups) =
+ &Apache::loncoursedata::get_group_memberships($classlist,$keylist,
+ $cdom,$cnum);
}
# Get discussion display default settings for user
@@ -225,7 +227,15 @@ sub list_discussion {
}
$visit ++;
- my $seeid=&Apache::lonnet::allowed('rin',$crs);
+ my $seeid;
+ if (($group ne '') && ($mode eq 'board') &&
+ ($ressymb =~ m|^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|)) {
+ if (&check_group_priv($group,'dgp') eq 'ok') {
+ $seeid = 1;
+ }
+ } else {
+ $seeid=&Apache::lonnet::allowed('rin',$crs);
+ }
my @discussionitems=();
my %shown = ();
my @posteridentity=();
@@ -252,7 +262,7 @@ sub list_discussion {
$discinfo{$visitkey} = $visit;
&Apache::lonnet::put('nohist_'.$cid.'_discuss',\%discinfo,$env{'user.domain'},$env{'user.name'});
- &build_posting_display(\%usernamesort,\%subjectsort,\%namesort,\%notshown,\%newitem,\%dischash,\%shown,\%alldiscussion,\%imsitems,\%imsfiles,\%roleinfo,\@discussionitems,\@replies,\@depth,\@posters,\$maxdepth,\$visible,\$newpostsflag,\$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$encsymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,$statusfilter,$toggkey,$outputtarget,\%anonhash,$anoncnt);
+ &build_posting_display(\%usernamesort,\%subjectsort,\%namesort,\%notshown,\%newitem,\%dischash,\%shown,\%alldiscussion,\%imsitems,\%imsfiles,\%roleinfo,\@discussionitems,\@replies,\@depth,\@posters,\$maxdepth,\$visible,\$newpostsflag,\$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$encsymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,\@rolefilter,\@sectionpick,\@grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,\%anonhash,$anoncnt,$group);
my $discussion='';
my $manifestfile;
@@ -325,6 +335,7 @@ sub list_discussion {
if ($newpostsflag) {
$chglink .= '&previous='.$prevread;
}
+ $chglink.=&group_args($group);
if ($visible) {
# Print the discusssion
@@ -403,16 +414,19 @@ imscp_v1p1.xsd http://www.imsglobal.org/
if ($newpostsflag) {
$discussion .= '&previous='.$prevread;
}
+ $discussion .= &group_args($group);
$discussion .='">'.&mt('Threaded View').' '.
''.&mt('Chronological View').'
'.&mt('Sorting/Filtering options').'  ';
} else {
$discussion .= '
';
@@ -421,12 +435,17 @@ imscp_v1p1.xsd http://www.imsglobal.org/
if ($newpostsflag) {
$discussion .= '&previous='.$prevread;
}
+ $discussion .= &group_args($group);
$discussion .= '">'.&mt('Export').'? | ';
if ($newpostsflag) {
if (!$markondisp) {
- $discussion .=''.
- &mt('Preferences on what is marked as NEW').
- ' '.&mt('Mark NEW posts no longer new').'';
+ $discussion .=' | '.
+ &mt('Preferences on what is marked as NEW').
+ ' '.&mt('Mark NEW posts no longer new').'';
} else {
$discussion .= ' | | ';
}
@@ -443,6 +462,7 @@ imscp_v1p1.xsd http://www.imsglobal.org/
if ($newpostsflag) {
$discussion .= '&previous='.$prevread;
}
+ $discussion .= &group_args($group);
$discussion .= '">'.&mt('Show all posts').' '.&mt('to display').' '.
$numhidden.' ';
if ($showunmark) {
@@ -611,6 +631,10 @@ END
$filterchoice = ''.&mt('sections').'- '.$env{'form.sectionpick'};
$filterchoice .= ' ';
}
+ if (@grouppick > 0) {
+ $filterchoice = ''.&mt('groups').'- '.$env{'form.grouppick'};
+ $filterchoice .= ' ';
+ }
if (@rolefilter > 0) {
$filterchoice .= ''.&mt('roles').'-';
foreach (@rolefilter) {
@@ -689,9 +713,8 @@ END
if ($discussiononly) {
my $now = time;
my $attachnum = 0;
- my $newattachmsg = '';
- my @currnewattach = ();
- my @currdelold = ();
+ my $currnewattach = [];
+ my $currdelold = [];
my $comment = '';
my $subject = '';
if ($env{'form.origpage'}) {
@@ -699,51 +722,26 @@ END
$subject = &unescape($env{'form.subject'});
$comment = &unescape($env{'form.comment'});
my @keepold = ();
- &process_attachments(\@currnewattach,\@currdelold,\@keepold);
- if (@currnewattach > 0) {
- $attachnum += @currnewattach;
+ &process_attachments($currnewattach,$currdelold,\@keepold);
+ if (@{$currnewattach} > 0) {
+ $attachnum += @{$currnewattach};
}
}
if (&discussion_open($status)) {
- $discussion.=(<
-
-
-
-
-
-
-Note: in anonymous discussion, your name is visible only
-to course faculty
-Title:
-
-ENDDISCUSS
- if ($env{'form.origpage'}) {
- $discussion.=''."\n";
- foreach (@currnewattach) {
- $discussion.=''."\n";
- }
- }
- $discussion.="\n";
- if ($outputtarget ne 'tex') {
- $discussion.=&generate_attachments_button('',$attachnum,$ressymb,$now,\@currnewattach,\@currdelold,'',$mode);
- if (@currnewattach > 0) {
- $newattachmsg .= '
New attachments
';
- if (@currnewattach > 1) {
- $newattachmsg .= '';
- foreach my $item (@currnewattach) {
- $item =~ m#.*/([^/]+)$#;
- $newattachmsg .= '- '.$1.'
'."\n";
- }
- $newattachmsg .= '
'."\n";
- } else {
- $currnewattach[0] =~ m#.*/([^/]+)$#;
- $newattachmsg .= ''.$1.'
'."\n";
- }
+ if (($group ne '') && ($mode eq 'board')) {
+ if (&check_group_priv($group,'pgd') eq 'ok') {
+ $discussion .=
+ &postingform_display($mode,$ressymb,$now,$subject,
+ $comment,$outputtarget,$attachnum,
+ $currnewattach,$currdelold,
+ $group);
}
- $discussion.=$newattachmsg;
- $discussion.=&generate_preview_button();
- }
+ } else {
+ $discussion.=
+ &postingform_display($mode,$ressymb,$now,$subject,
+ $comment,$outputtarget,$attachnum,
+ $currnewattach,$currdelold);
+ }
}
} else {
$discussion.='';
+ &mt('Send Message').'';
}
return $discussion;
}
+sub postingform_display {
+ my ($mode,$ressymb,$now,$subject,$comment,$outputtarget,$attachnum,
+ $currnewattach,$currdelold,$group) = @_;
+ my $newattachmsg;
+ my $postingform = (<
+
+
+
+
+Note: in anonymous discussion, your name is visible only
+to course faculty
+Title:
+
+ENDDISCUSS
+ if ($env{'form.origpage'}) {
+ $postingform .= ''."\n";
+ foreach my $att (@{$currnewattach}) {
+ $postingform .= ''."\n";
+ }
+ }
+ if (exists($env{'form.ref'})) {
+ $postingform .= '';
+ }
+ if ($group ne '') {
+ $postingform .='';
+ }
+ $postingform .= "\n";
+ if ($outputtarget ne 'tex') {
+ $postingform .= &generate_attachments_button('',$attachnum,$ressymb,
+ $now,$currnewattach,
+ $currdelold,'',$mode);
+ if ((ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)) {
+ $newattachmsg = '
New attachments
';
+ if (@{$currnewattach} > 1) {
+ $newattachmsg .= '';
+ foreach my $item (@{$currnewattach}) {
+ $item =~ m#.*/([^/]+)$#;
+ $newattachmsg .= '- '.$1.'
'."\n";
+ }
+ $newattachmsg .= '
'."\n";
+ } else {
+ $$currnewattach[0] =~ m#.*/([^/]+)$#;
+ $newattachmsg .= ''.$1.'
'."\n";
+ }
+ }
+ $postingform .= $newattachmsg;
+ $postingform .= &generate_preview_button();
+ }
+ return $postingform;
+}
+
sub build_posting_display {
- my ($usernamesort,$subjectsort,$namesort,$notshown,$newitem,$dischash,$shown,$alldiscussion,$imsitems,$imsfiles,$roleinfo,$discussionitems,$replies,$depth,$posters,$maxdepth,$visible,$newpostsflag,$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$ressymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$statusfilter,$toggkey,$outputtarget,$anonhash,$anoncnt) = @_;
+ my ($usernamesort,$subjectsort,$namesort,$notshown,$newitem,$dischash,$shown,$alldiscussion,$imsitems,$imsfiles,$roleinfo,$discussionitems,$replies,$depth,$posters,$maxdepth,$visible,$newpostsflag,$current,$status,$viewgrades,$seeid,$prevread,$sortposts,$ressymb,$target,$readkey,$showunmark,$showonlyunread,$totposters,$rolefilter,$sectionpick,$grouppick,$classgroups,$statusfilter,$toggkey,$outputtarget,$anonhash,$anoncnt,$group) = @_;
my @original=();
my @index=();
+ my $skip_group_check = 0;
my $symb=&Apache::lonenc::check_decrypt($ressymb);
my $escsymb=&escape($ressymb);
my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'});
+ if ((@{$grouppick} == 0) || (grep(/^all$/,@{$grouppick}))) {
+ $skip_group_check = 1;
+ }
if ($contrib{'version'}) {
my $oldest = $contrib{'1:timestamp'};
if ($prevread eq '0') {
@@ -783,7 +840,8 @@ sub build_posting_display {
}
my ($skiptest,$rolematch,$roleregexp,$secregexp,$statusregexp);
if ($sortposts) {
- ($skiptest,$roleregexp,$secregexp,$statusregexp) = &filter_regexp($rolefilter,$sectionpick,$statusfilter);
+ ($skiptest,$roleregexp,$secregexp,$statusregexp) =
+ &filter_regexp($rolefilter,$sectionpick,$statusfilter);
$rolematch = $roleregexp.':'.$secregexp.':'.$statusregexp;
}
for (my $id=1;$id<=$contrib{'version'};$id++) {
@@ -872,7 +930,7 @@ sub build_posting_display {
@{$$subjectsort{$subject}} = ("$idx");
}
}
- if ((!$contrib{$idx.':anonymous'}) || ($seeid)) {
+ if ((!$contrib{$idx.':anonymous'}) || (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')))) {
$sender=&Apache::loncommon::aboutmewrapper(
$plainname,
$contrib{$idx.':sendername'},
@@ -913,14 +971,16 @@ sub build_posting_display {
} else {
@{$$namesort{$lastname}{$firstname}} = ("$idx");
}
- if (&editing_allowed()) {
+ if (&editing_allowed($escsymb.':::'.$idx,$group)) {
if (($env{'user.domain'} eq $contrib{$idx.':senderdomain'}) && ($env{'user.name'} eq $contrib{$idx.':sendername'})) {
$sender.=' '.&mt('Edit').'';
+ $sender .= &group_args($group);
+ $sender .= '" '.$target.'>'.&mt('Edit').'';
+
unless ($seeid) {
$sender.=" ';
@@ -943,6 +1003,7 @@ sub build_posting_display {
if ($$newpostsflag) {
$sender .= '&previous='.$prevread;
}
+ $sender .= &group_args($group);
$sender .= '">'.&mt('Hide').'';
}
$sender.=' '.&mt('Delete').'';
}
} else {
@@ -977,16 +1039,27 @@ sub build_posting_display {
@{$$namesort{'__anon'}{'__anon'}} = ("$idx");
}
}
- if (&discussion_open($status) &&
- &Apache::lonnet::allowed('pch',
- $env{'request.course.id'}.
- ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''))) {
- $sender.=' '.&mt('Reply').'';
+ } elsif (&Apache::lonnet::allowed('pch',
+ $env{'request.course.id'}.
+ ($env{'request.course.sec'}?'/'.
+ $env{'request.course.sec'}:''))) {
+ $sender.=' '.&mt('Reply').'';
}
- $sender .= '" '.$target.'>'.&mt('Reply').'';
}
if ($viewgrades) {
$vgrlink=&Apache::loncommon::submlink('Submissions',
@@ -1043,7 +1116,7 @@ sub build_posting_display {
my $uname = $contrib{$idx.':sendername'};
my $udom = $contrib{$idx.':senderdomain'};
my $poster = $uname.':'.$udom;
- if (defined($env{'form.totposters'})) {
+ if ($env{'form.totposters'} ne '') {
if ($totposters == 0) {
$$shown{$idx} = 0;
} elsif ($totposters > 0) {
@@ -1068,6 +1141,23 @@ sub build_posting_display {
}
}
}
+ if ($$shown{$idx} && !$skip_group_check) {
+ my $showflag = 0;
+ if (ref($$classgroups{$poster}{active}) eq 'HASH') {
+ foreach my $grp (@{$grouppick}) {
+ if (grep/^\Q$grp\E$/,
+ keys(%{$$classgroups{$poster}{active}})) {
+ $showflag = 1;
+ last;
+ }
+ }
+ }
+ if ($showflag) {
+ $$shown{$idx} = 1;
+ } else {
+ $$shown{$idx} = 0;
+ }
+ }
} else {
$$shown{$idx} = 1;
}
@@ -1098,7 +1188,9 @@ sub build_posting_display {
my @postversions = ();
$$discussionitems[$idx] .= &mt('This post has been edited by the author.');
if ($seeid) {
- $$discussionitems[$idx] .= ' '.&mt('Display all versions').'';
+ $$discussionitems[$idx] .= ' '.&mt('Display all versions').'';
}
$$discussionitems[$idx].='
'.&mt('Earlier version(s) were posted on: ');
if ($contrib{$idx.':history'} =~ m/:/) {
@@ -1161,6 +1253,7 @@ sub filter_regexp {
$secregexp .= '[^:]*';
}
}
+
if (defined($statusfilter) && $statusfilter ne '') {
if ($statusfilter eq 'all') {
$statusregexp = '[^:]+';
@@ -1181,7 +1274,7 @@ sub get_post_contents {
%{$$imsfiles{$idx}}=();
if ($type eq 'allversions') {
unless($seeid) {
- $discussion=&mt('You do not have privileges to view all versions of posts.').&mt('Please select a different role');
+ $discussion=&mt('You do not have privileges to view all versions of posts.').' '.&mt('Please select a different role.');
return $discussion;
}
}
@@ -1308,7 +1401,7 @@ sub replicate_attachments {
sub mail_screen {
my ($r,$feedurl,$options) = @_;
if (exists($env{'form.origpage'})) {
- &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['subject','comment','currnewattach','addnewattach','deloldattach','delnewattach','timestamp','idx','anondiscuss','discuss','blog']);
+ &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},['subject','comment','currnewattach','addnewattach','deloldattach','delnewattach','timestamp','idx','anondiscuss','discuss','blog','group','ref']);
}
my $title=&Apache::lonnet::gettitle($feedurl);
@@ -1550,6 +1643,12 @@ Attachment (128 KB max size):
END
}
+ if (exists($env{'form.group'})) {
+ $r->print('');
+ }
+ if (exists($env{'form.ref'})) {
+ $r->print('');
+ }
$r->print(<
@@ -1584,7 +1683,7 @@ END
}
}
if ($attachmsg) {
- $r->print("Retained attachments:$attachmsg
\n");
+ $r->print("
Retained attachments:$attachmsg
\n");
}
if ($newattachmsg) {
$r->print("$newattachmsg
");
@@ -1789,11 +1888,19 @@ END
+END
+ if (exists($env{'form.group'})) {
+ $r->print('');
+ }
+ if (exists($env{'form.ref'})) {
+ $r->print('');
+ }
+ $r->print("
$end_page
-END
+ ");
return;
}
@@ -1807,6 +1914,9 @@ sub print_sortfilter_options {
my @sections;
my $section_sel = '';
my $numvisible = 5;
+ my @groups;
+ my $group_sel = '';
+ my $numgroupvis = 5;
my %sectioncount = &Apache::loncommon::get_sections();
if ($env{'request.course.sec'} !~ /^\s*$/) { #Restrict section choice to current section
@@ -1820,10 +1930,36 @@ sub print_sortfilter_options {
unshift(@sections,'all'); # Put 'all' at the front of the list
}
- foreach (@sections) {
- $section_sel .= " $_\n";
+ foreach my $sec (@sections) {
+ $section_sel .= " \n";
}
-
+
+ if (&check_group_priv() eq 'ok') {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum);
+ @groups = sort {$a cmp $b} keys(%curr_groups);
+ if (scalar(@groups) < 4) {
+ $numgroupvis = scalar(@groups) + 1;
+ }
+ unshift(@groups,'all'); # Put 'all' at the front of the list
+ } else {
+ my @coursegroups = split(/:/,$env{'request.course.groups'});
+ if (@coursegroups > 0) {
+ @coursegroups = sort {$a cmp $b} @coursegroups;
+ @groups = ('all',@coursegroups);
+ if (scalar(@groups) < 4) {
+ $numgroupvis = scalar(@groups) + 1;
+ }
+ } else {
+ @groups = ('all');
+ $numgroupvis = 1;
+ }
+ }
+ foreach my $group (@groups) {
+ $group_sel .= " \n";
+ }
+
my $function = &Apache::loncommon::get_users_function();
my $tabcolor = &Apache::loncommon::designparm($function.'.tabbg',
$env{'user.domain'});
@@ -1836,6 +1972,7 @@ sub print_sortfilter_options {
'spur' => 'Specific user roles',
'sprs' => 'Specific role status',
'spse' => 'Specific sections',
+ 'spgr' => 'Specific groups',
'psub' => 'Pick specific users (by name)',
'shal' => 'Show a list of current posters'
);
@@ -1867,6 +2004,17 @@ function verifyFilter() {
if (secnum == 0) {
document.modifyshown.sectionpick.options[0].selected = true
}
+
+ var grpnum = 0
+ for (var i=0; i
@@ -1892,48 +2040,56 @@ $start_page
|
$lt{'spse'} |
|
+ $lt{'spgr'} |
+ |
$lt{'psub'} |
-
+ |
|
|
-
+ |
|
|
-
+ |
|
|
-
+ |
|
|
- |
+
+
+ |
+ |
+ |
@@ -1941,11 +2097,19 @@ $start_page
+END
+ if (exists($env{'form.group'})) {
+ $r->print('');
+ }
+ if (exists($env{'form.ref'})) {
+ $r->print('');
+ }
+ $r->print("
$end_page
-END
+");
}
sub print_showposters {
@@ -1960,19 +2124,36 @@ sub print_showposters {
$crs.='_'.$env{'request.course.sec'};
}
$crs=~s/\_/\//g;
- my $seeid=&Apache::lonnet::allowed('rin',$crs);
+ my $seeid;
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my $group = $env{'form.group'};
+ my $ressymb = &wrap_symb($symb);
+ if (($group ne '') &&
+ ($ressymb =~ m|^bulletin___ \d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|)) {
+ if (&check_group_priv($group,'dgp') eq 'ok') {
+ $seeid = 1;
+ }
+ } else {
+ $seeid=&Apache::lonnet::allowed('rin',$crs);
+ }
my %contrib=&Apache::lonnet::restore($symb,$env{'request.course.id'},
- $env{'course.'.$env{'request.course.id'}.'.domain'},
- $env{'course.'.$env{'request.course.id'}.'.num'});
+ $cdom,$cnum);
my %namesort = ();
my %postcounts = ();
+ my %lt = &Apache::lonlocal::texthash(
+ sele => 'Select',
+ full => 'Fullname',
+ usdo => 'Username/domain',
+ post => 'Posts',
+ );
if ($contrib{'version'}) {
for (my $idx=1;$idx<=$contrib{'version'};$idx++) {
my $hidden=($contrib{'hidden'}=~/\.$idx\./);
my $deleted=($contrib{'deleted'}=~/\.$idx\./);
unless ((($hidden) && (!$seeid)) || ($deleted)) {
- if ((!$contrib{$idx.':anonymous'}) || ($seeid)) {
+ if ((!$contrib{$idx.':anonymous'}) || (&Apache::lonnet::allowed('rin',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'')))) {
my %names = &Apache::lonnet::get('environment',['firstname','lastname'],$contrib{$idx.':senderdomain'},$contrib{$idx.':sendername'});
my $lastname = $names{'lastname'};
my $firstname = $names{'firstname'};
@@ -2007,10 +2188,10 @@ $start_page
$table_start
- No. |
- Select |
- Fullname(Username/domain) |
- Posts |
+ # |
+ $lt{'sele'} |
+ $lt{'full'} ($lt{'usdo'}) |
+ $lt{'post'} |
END
my $count = 0;
@@ -2121,18 +2302,18 @@ ENDFAILREDIR
}
sub redirect_back {
- my ($r,$feedurl,$typestyle,$sendsomething,$sendposts,$blog,$status,$previous,$sort,$rolefilter,$statusfilter,$sectionpick,$numpicks) = @_;
+ my ($r,$feedurl,$typestyle,$sendsomething,$sendposts,$blog,$status,$previous,$sort,$rolefilter,$statusfilter,$sectionpick,$grouppick,$numpicks,$group) = @_;
my $sorttag = '';
my $roletag = '';
my $statustag = '';
my $sectag = '';
+ my $grptag = '';
my $userpicktag = '';
my $qrystr = '';
my $prevtag = '';
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
-
&dewrapper(\$feedurl);
if ($feedurl=~/^\/adm\//) { $feedurl.='?register=1' };
if ($previous > 0) {
@@ -2171,6 +2352,20 @@ sub redirect_back {
$feedurl .= '§ionpick='.$sectionpick;
$sectag = '';
}
+ if (ref($grouppick) eq 'ARRAY') {
+ $feedurl .= '&grouppick=';
+ $sectag .= '';
+ } else {
+ $feedurl .= '&grouppick='.$grouppick;
+ $grptag = '';
+ }
if (ref($rolefilter) eq 'ARRAY') {
$feedurl .= '&rolefilter=';
$roletag .= '';
}
}
+ my $grouptag;
+ if ($group ne '') {
+ $grouptag = ''; my $refarg;
+ if (exists($env{'form.ref'})) {
+ $refarg = '&ref='.$env{'form.ref'};
+ $grouptag .= '';
+ }
+ if ($feedurl =~ /\?/) {
+ $feedurl .= '&group='.$group.$refarg;
+ } else {
+ $feedurl .= '?group='.$group.$refarg;
+ }
+ }
$feedurl=&Apache::lonenc::check_encrypt($feedurl);
my $logo=&Apache::loncommon::lonhttpdurl('/adm/lonIcons/lonlogos.gif');
my %onload;
@@ -2197,12 +2405,11 @@ sub redirect_back {
"if (window.name!='loncapaclient') { this.document.reldt.submit(); self.window.close(); }";
}
my $start_page=
- &Apache::loncommon::start_page('New posts marked as read',undef,
- {'redirect' => [2,$feedurl],
+ &Apache::loncommon::start_page('Feedback sent',undef,
+ {'redirect' => [0,$feedurl],
'only_body' => 1,
'add_entries' => \%onload});
my $end_page = &Apache::loncommon::end_page();
-
$r->print(<
@@ -2216,7 +2423,9 @@ $sorttag
$statustag
$roletag
$sectag
+$grptag
$userpicktag
+$grouptag
$end_page
ENDREDIR
@@ -2712,7 +2921,7 @@ END
}
}
}
- if (@{$currnewattach} > 0) {
+ if ((ref($currnewattach) eq 'ARRAY') && (@{$currnewattach} > 0)) {
$r->print("The following attachments have been uploaded for inclusion with this posting.
Check the checkboxes for any you wish to remove
\n");
foreach (@{$currnewattach}) {
$_ =~ m#/([^/]+)$#;
@@ -2960,8 +3169,9 @@ sub sort_filter_names {
);
%{$status_types} = (
all => 'Roles of any status',
- Active => 'Only active roles',
- Expired => 'Only inactive roles'
+ Active => 'Only active roles',
+ Expired => 'Only past roles',
+ Future => 'Only future roles',
);
}
@@ -2976,13 +3186,15 @@ sub handler {
# --------------------------- Get query string for limited number of parameters
&Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'},
- ['hide','unhide','deldisc','postdata','preview','replydisc','editdisc','cmd','symb','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortposts','applysort','rolefilter','statusfilter','sectionpick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export','sendmessageonly']);
+ ['hide','unhide','deldisc','postdata','preview','replydisc','editdisc','cmd','symb','onlyunread','allposts','onlyunmark','previous','markread','markonread','markondisp','toggoff','toggon','modifydisp','changes','navtime','navmaps','navurl','sortposts','applysort','rolefilter','statusfilter','sectionpick','groupick','posterlist','userpick','attach','origpage','currnewattach','deloldattach','keepold','allversions','export','sendmessageonly','group','ref']);
+ my $group = $env{'form.group'};
if ($env{'form.editdisc'}) {
- if (!(&editing_allowed())) {
+ if (!(&editing_allowed($env{'form.editdisc'},$env{'form.group'}))) {
my $symb=(split(/\:\:\:/,$env{'form.editdisc'}))[0];
my ($map,$id,$url)=&Apache::lonnet::decode_symb($symb);
my $feedurl=&Apache::lonnet::clutter($url);
- &redirect_back($r,$feedurl,&mt('Editing not permitted').'
', '0','0','','',$env{'form.previous'},'','','',);
+ &redirect_back($r,$feedurl,&mt('Editing not permitted').'
', '0','0','','',$env{'form.previous'},undef,undef,undef,
+ undef,undef,undef,$group);
return OK;
}
}
@@ -3009,7 +3221,8 @@ sub handler {
\%readinghash,$env{'user.domain'},$env{'user.name'});
}
&redirect_back($r,$feedurl,&mt('Marked postings read/unread').'
',
- '0','0','','',$env{'form.previous'},'','','',);
+ '0','0','','',$env{'form.previous'},'','','',
+ undef,undef,undef,$group);
return OK;
}
if ($env{'form.allversions'}) {
@@ -3024,9 +3237,20 @@ sub handler {
$crs.='_'.$env{'request.course.sec'};
}
$crs=~s|_|/|g;
- my $seeid=&Apache::lonnet::allowed('rin',$crs);
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
my ($symb,$idx)=split(/\:\:\:/,$env{'form.allversions'});
($symb)=&get_feedurl_and_clean_symb($symb);
+ my $ressymb = &wrap_symb($symb);
+ my $group = $env{'form.group'};
+ my $seeid;
+ if (($group ne '') && (($ressymb =~ m|^bulletin___\d+___adm/wrapper/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard$|))) {
+ if (&check_group_priv($group,'dgp') eq 'ok') {
+ $seeid = 1;
+ }
+ } else {
+ $seeid = &Apache::lonnet::allowed('rin',$crs);
+ }
if ($idx > 0) {
my %messages = ();
my %subjects = ();
@@ -3058,7 +3282,7 @@ sub handler {
\%discinfo,$env{'user.domain'},$env{'user.name'});
&redirect_back($r,$feedurl,&mt('Changed sort/filter').'
','0','0','',
'',$env{'form.previous'},$env{'form.sortposts'},'','','',
- $numpicks);
+ '',$numpicks,$group);
return OK;
}
if ($env{'form.applysort'}) {
@@ -3066,7 +3290,8 @@ sub handler {
&redirect_back($r,$feedurl,&mt('Changed sort/filter').'
','0','0','',
'',$env{'form.previous'},$env{'form.sortposts'},
$env{'form.rolefilter'},$env{'form.statusfilter'},
- $env{'form.sectionpick'});
+ $env{'form.sectionpick'},$env{'form.grouppick'},
+ undef,$group);
return OK;
} elsif ($env{'form.cmd'} eq 'sortfilter') {
my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'});
@@ -3171,7 +3396,7 @@ ENDREDIR
my $previous=$env{'form.previous'};
if ($env{'form.markondisp'}) { $previous=undef; }
&redirect_back($r,$feedurl,&mt('Changed display status').'
',
- '0','0','','',$previous);
+ '0','0','','',$previous,'','','','','','',$group);
return OK;
} elsif (($env{'form.hide'}) || ($env{'form.unhide'})) {
# ----------------------------------------------------------------- Hide/unhide
@@ -3186,8 +3411,9 @@ ENDREDIR
$crs=~s/\_/\//g;
my $seeid=&Apache::lonnet::allowed('rin',$crs);
- if ($env{'form.hide'} && !$seeid && !(&editing_allowed())) {
- &redirect_back($r,$feedurl,&mt('Deletion not permitted').'
', '0','0','','',$env{'form.previous'},'','','',);
+ if ($env{'form.hide'} && !$seeid && !(&editing_allowed($env{'form.hide'},$env{'form.group'}))) {
+ &redirect_back($r,$feedurl,&mt('Deletion not permitted').'
', '0','0','','',$env{'form.previous'},'','','','',
+ undef,undef,$group,);
return OK;
}
@@ -3216,7 +3442,8 @@ ENDREDIR
$env{'course.'.$env{'request.course.id'}.'.num'});
&redirect_back($r,$feedurl,&mt('Changed discussion status').'
',
- '0','0','','',$env{'form.previous'});
+ '0','0','','',$env{'form.previous'},undef,undef,undef,
+ undef,undef,undef,$group);
return OK;
} elsif ($env{'form.cmd'}=~/^(threadedoff|threadedon)$/) {
my ($symb,$feedurl)=&get_feedurl_and_clean_symb($env{'form.symb'});
@@ -3228,7 +3455,8 @@ ENDREDIR
&Apache::lonnet::delenv('environment\.threadeddiscussion');
}
&redirect_back($r,$feedurl,&mt('Changed discussion view mode').'
',
- '0','0','','',$env{'form.previous'});
+ '0','0','','',$env{'form.previous'},undef,undef,undef,
+ undef,undef,undef,$group);
return OK;
} elsif ($env{'form.deldisc'}) {
# --------------------------------------------------------------- Hide for good
@@ -3242,7 +3470,8 @@ ENDREDIR
$env{'course.'.$env{'request.course.id'}.'.domain'},
$env{'course.'.$env{'request.course.id'}.'.num'});
&redirect_back($r,$feedurl,&mt('Changed discussion status').'
',
- '0','0','','',$env{'form.previous'});
+ '0','0','','',$env{'form.previous'},undef,undef,undef,
+ undef,undef,undef,$group);
return OK;
} elsif ($env{'form.preview'}) {
# -------------------------------------------------------- User wants a preview
@@ -3417,10 +3646,10 @@ ENDREDIR
$attachmenturl,%to);
# Discussion? Store that.
-
my $numpost=0;
- if ($env{'form.discuss'} =~/^(?:non|)anon$/
- || $env{'form.anondiscuss'}) {
+ if ( ($env{'form.discuss'} ne ''
+ && $env{'form.discuss'} !~ /^(?:author|question|course|policy)/)
+ || $env{'form.anondiscuss'} ne '') {
my $subject = &clear_out_html($env{'form.subject'},undef,1);
my $anonmode=($env{'form.discuss'} eq 'anon' || $env{'form.anondiscuss'} );
$typestyle.=&adddiscuss($symb,$message,$anonmode,$attachmenturl,
@@ -3441,7 +3670,7 @@ ENDREDIR
}
# Receipt screen and redirect back to where came from
- &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$blog,$status,$env{'form.previous'});
+ &redirect_back($r,$feedurl,$typestyle,$numsent,$numpost,$blog,$status,$env{'form.previous'},undef,undef,undef,undef,undef,undef,$group);
}
return OK;
}
@@ -3482,7 +3711,19 @@ sub get_feedurl_and_clean_symb {
}
sub editing_allowed {
+ my ($postid,$group) = @_;
+ $postid = &unescape($postid);
my $can_edit = 0;
+ if ($group ne '') {
+ my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'};
+ my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'};
+ if ($postid =~ m|^bulletin___\d+___adm/wrapper(/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard)|) {
+ if (&check_group_priv($group,'egp') eq 'ok') {
+ $can_edit = 1;
+ }
+ return $can_edit;
+ }
+ }
my $cid = $env{'request.course.id'};
my $role = (split(/\./,$env{'request.role'}))[0];
my $section = $env{'request.course.sec'};
@@ -3509,5 +3750,32 @@ sub editing_allowed {
return $can_edit;
}
+sub check_group_priv {
+ my ($group,$grp_priv) = @_;
+ foreach my $priv ('mdg','vcg') {
+ my $checkcourse = $env{'request.course.id'}.
+ ($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:'');
+ if (&Apache::lonnet::allowed($priv,$checkcourse)) {
+ return 'ok';
+ }
+ }
+ if ($grp_priv && $group ne '') {
+ if (&Apache::lonnet::allowed($grp_priv,$env{'request.course.id'}.'/'.$group)) {
+ return 'ok';
+ }
+ }
+ return '';
+}
+
+sub group_args {
+ my ($group) = @_;
+ if ($group eq '') { return ''; }
+ my $extra_args = '&group='.$group;
+ if (exists($env{'form.ref'})) {
+ $extra_args .= '&ref='.$env{'form.ref'};
+ }
+ return $extra_args;
+}
+
1;
__END__