# The LearningOnline Network # Group Bulletin Boards Manager # # Copyright Michigan State University Board of Trustees # # This file is part of the LearningOnline Network with CAPA (LON-CAPA). # # LON-CAPA is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # LON-CAPA is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # You should have received a copy of the GNU General Public License # along with LON-CAPA; if not, write to the Free Software # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA # # /home/httpd/html/adm/gpl.txt # # http://www.lon-capa.org/ # package Apache::groupboards; use strict; use Apache::Constants qw(:common :http); use Apache::loncommon; use Apache::lonnet; use Apache::lonnavmaps; use Apache::lonuserstate; use Apache::lonratedt; use Apache::lonlocal; use LONCAPA; sub handler { my ($r) = @_; &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; return OK if $r->header_only; # Needs to be in a course if (! ($env{'request.course.fn'})) { # Not in a course $env{'user.error.msg'}= "/adm/groupboards:mdg:0:0:Cannot edit or view course groups"; return HTTP_NOT_ACCEPTABLE; } &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['group']); my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; my $now = time; my $crstype = &Apache::loncommon::course_type(); my $gpterm = &Apache::loncommon::group_term(); my $bodytitle = &mt('[_1] Discussion Boards',$crstype); my $group = $env{'form.group'}; if (!defined($group)) { $r->print(&Apache::loncommon::start_page($bodytitle)); $r->print(&mt('No [_1] defined, so there are no [_1] discussion boards to display',$gpterm)); $r->print(&Apache::loncommon::end_page()); return OK; } my $can_create=&Apache::lonnet::allowed('cgb',$env{'request.course.id'}. '/'.$group); my $can_view=&Apache::lonnet::allowed('pgd',$env{'request.course.id'}. '/'.$group); if (defined($env{'form.newbul'})) { if (($can_create) || (&Apache::lonnet::allowed('mdg',$env{'request.course.id'}))) { $r->print(&Apache::loncommon::start_page($bodytitle)); my ($outcome,$symb,$newurl,$bbtitle) = &create_board($cdom,$cnum,$group,$env{'form.newbul'}); if ($outcome eq 'ok') { my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum); $r->print(&mt('The new discussion board was added successfully.
')); $r->print(''. '
'. ''. &mt('Edit [_1] board',$bbtitle).'  '. ''. &mt('View all group discussion boards'). '
'); } else { $r->print(&mt('There was a problem creating the new discussion board - [_1]',''.$outcome.'').'
'. &mt('Return to discussion boards').''); } $r->print(&Apache::loncommon::end_page()); return OK; } } my $jscript; if (($can_create) || (&Apache::lonnet::allowed('mdg',$env{'request.course.id'}))) { $jscript = qq| function makebulboard() { var title=prompt('Discussion Board Title'); if (title) { this.document.forms.newbb.newbul.value= title+'=/adm/$cdom/$cnum/$now/bulletinboard'; this.document.forms.newbb.submit(); } } |; } $r->print(&Apache::loncommon::start_page($bodytitle, '')); if (!$can_view) { $r->print(&mt('You do not have privileges to view discussion boards in this [_1]',$crstype)); return OK; } my $navmap = Apache::lonnavmaps::navmap->new(); my @groupboards; my %boards; my $grpbbmap = &get_bbfolder_url($cdom,$cnum,$group); if ($grpbbmap) { my $bbfolderres = $navmap->getResourceByUrl($grpbbmap); if ($bbfolderres) { my @boards = $navmap->retrieveResources($bbfolderres,undef,0,0); foreach my $res (@boards) { my $url = $res->src(); if ($url =~ m|^/adm/\Q$cdom\E/\Q$cnum\E/\d+/bulletinboard|) { push(@groupboards,$res->symb()); $boards{$res->symb()} = { title => $res->title(), url => $res->src(), }; } } } } if (($can_create) || (&Apache::lonnet::allowed('mdg',$env{'request.course.id'}))) { $r->print('
'. "\n".''."\n". ' '."\n". ' '. "\n".'

'); } if (@groupboards) { foreach my $board (@groupboards) { $r->print(''.$boards{$board}{'title'}.'
'); } } else { $r->print(&mt('There are currently no discussion boards in this [_1].', $gpterm)); } $r->print(&Apache::loncommon::end_page()); return OK; } sub create_board { my ($cdom,$cnum,$group,$newboard,$symb) = @_; my ($bbtitle,$newurl)=split(/\=/,$newboard); $bbtitle=&unescape($bbtitle); $newurl=&unescape($newurl); my $allbbsmap = &get_bbfolder_url($cdom,$cnum,$group); my ($outcome,$symb); if ($allbbsmap =~ m|^/uploaded|) { my ($errtext,$fatal)=&Apache::lonratedt::mapread($allbbsmap); if (!$fatal) { my $newidx=&Apache::lonratedt::getresidx($newurl); $Apache::lonratedt::resources[$newidx]=$bbtitle.':'.$newurl. ':false:normal:res'; push(@Apache::lonratedt::order,$newidx); my ($errtext,$fatal)=&Apache::lonratedt::storemap($allbbsmap,1); if ($fatal) { $outcome = "error: failed to store discussion boards map - $errtext\n"; } else { $outcome = 'ok'; $symb = &Apache::lonnet::encode_symb($allbbsmap,$newidx,$newurl); } } else { $outcome = "error: failed to read all discussion boards map - $errtext\n"; } } else { $outcome = 'error: discussion boards folder absent, '. 'or in unexpected location - '.$allbbsmap."\n"; } return ($outcome,$symb,$newurl,$bbtitle); } sub get_bbfolder_url { my ($cdom,$cnum,$group) = @_; my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group); my $grpbbmap; if (%curr_groups) { my %group_info = &Apache::longroup::get_group_settings( $curr_groups{$group}); my $creation = $group_info{'creation'}; my $bbfolder = $creation + 1; my $crspath = '/uploaded/'.$cdom.'/'.$cnum.'/'; $grpbbmap = $crspath.'default_'.$bbfolder.'.sequence'; } return $grpbbmap; } 1;