File:  [LON-CAPA] / loncom / interface / groupboards.pm
Revision 1.23: download - view: text, annotated - select for diffs
Tue Sep 8 23:54:40 2020 UTC (3 years, 7 months ago) by raeburn
Branches: MAIN
CVS tags: version_2_12_X, version_2_11_X, version_2_11_4_uiuc, version_2_11_4_msu, version_2_11_4, version_2_11_3_uiuc, version_2_11_3_msu, version_2_11_3, HEAD
- Prevent localization of group description in breadcrumbs for group tools.

# The LearningOnline Network
# Group Bulletin Boards Manager
#
# $Id: groupboards.pm,v 1.23 2020/09/08 23:54:40 raeburn Exp $
#
# 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::lonuserstate();
use Apache::longroup;
use Apache::lonnavmaps;
use LONCAPA::map();
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','ref']);

    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 $ucgpterm = $gpterm;
    $ucgpterm =~ s/^(\w)/uc($1)/e;
    my $bodytitle = $ucgpterm.' Discussion Boards';
    my $group = $env{'form.group'};
    $group =~ s/\W//g;
    my ($description,$earlyout,$refarg);

    if (exists($env{'form.ref'})) {
        $refarg = 'ref='.$env{'form.ref'};
    }

    &Apache::lonhtmlcommon::clear_breadcrumbs();
    if (!defined($group)) {
        $earlyout = &mt("No $gpterm defined, so there are no $gpterm discussion boards to display");
        $r->print(&display_error($cdom,$cnum,$group,$description,$gpterm,
                                 $ucgpterm,$bodytitle,$earlyout,$refarg));
        return OK;
    }
    my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group);
    if (!defined($curr_groups{$group})) {
        $earlyout = &mt('Invalid group');
        $r->print(&display_error($cdom,$cnum,$group,$description,$gpterm,
                                 $ucgpterm,$bodytitle,$earlyout,$refarg));
        return OK;
    }
    my %content = &Apache::longroup::get_group_settings($curr_groups{$group});
    $description = &unescape($content{'description'});

    my $can_create=&Apache::lonnet::allowed('cgb',$env{'request.course.id'}.
                                            '/'.$group);
    my $can_view = &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));

    if (!$can_view) {
        $can_view = &Apache::lonnet::allowed('vgb',$env{'request.course.id'}.
                                          '/'.$group);
    }
    if (!$can_view) {
        $earlyout=&mt("You do not have privileges to view discussion boards in this $gpterm");
        $r->print(&display_error($cdom,$cnum,$group,$description,$gpterm,
                                 $ucgpterm,$bodytitle,$earlyout,$refarg));
        return OK;
    }
    if (defined($env{'form.newbul'})) {
        if (($can_create) || (&Apache::lonnet::allowed('mdg',$env{'request.course.id'}))) {
            $r->print(&boards_header($cdom,$cnum,$group,$description,$gpterm,
                                     $ucgpterm,$bodytitle,$refarg));
            my ($outcome,$newurl,$bbtitle,$lockfreed) = 
		&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.').'<br />');
                $r->print('<table border="0"><tr><td>'.
                          '<a href="'.$newurl.'?group='.$group.'&amp;'.$refarg.
                          '">'.&mt('Edit [_1] board',$bbtitle).'</a></td>'.
                           '<td>&nbsp;&nbsp;</td><td>'.
                          '<a href="/adm/groupboards?group='.$group.'&amp;'.
                          $refarg.'">'.&mt('View all group discussion boards').
                          '</a></td></tr></table>');
                if ($lockfreed ne 'ok') {
                    $r->print(&mt('There was a problem removing a lockfile for the group ([_1]).',$description).'<br />'.
                              &mt('This may prevent creation of additional discussion boards in this group.').'<br />'.
                              &mt('Please contact the [_1]helpdesk[_2] for assistance.',
                                  '<a href="/adm/helpdesk">','</a>')
                             );
                }
            } else {
                $r->print(&mt('There was a problem creating the new discussion board - [_1]','<span class="LC_error">'.$outcome.'</span>').'<br /><a href="/adm/groupboards?group='.$group.'">'.
                         &mt('Return to discussion boards').'</a>');
            }
            $r->print(&Apache::loncommon::end_page());
            return OK;
        }
    }
    my $jscript;
    if (($can_create) || (&Apache::lonnet::allowed('mdg',$env{'request.course.id'}))) {
        $jscript = qq|
<script type="text/javascript">
function makebulboard() {
   var title=prompt('Discussion Board Title');
   if (title) {
    this.document.forms.newbb.newbul.value=title;
    this.document.forms.newbb.submit();
   }
}
</script>
|;
    }
    $r->print(&boards_header($cdom,$cnum,$group,$description,$gpterm,$ucgpterm,
                             $bodytitle,$refarg,$jscript));
    my ($groupboards,$boards) = &Apache::longroup::get_group_bbinfo($cdom,$cnum,
                                                                    $group);
    if (($can_create) || (&Apache::lonnet::allowed('mdg',$env{'request.course.id'}))) {
        $r->print('<br /><form method="post" name="newbb" action="/adm/groupboards">'.
                  "\n".'<input type="button" name="bbbutton" value="'.
                  &mt('New Discussion Board').
                  '" onclick="javascript:makebulboard();" />'."\n".
                  '<input type="hidden" name="newbul" />'."\n".
                  '<input type="hidden" name="group" value="'.$group.'" />'.
                  '<input type="hidden" name="ref" value="'.$env{'form.ref'}.'" />'.
                  "\n".'</form><br />');
    }
    if (@{$groupboards} > 0) {
        $r->print('<br />'
                 .&Apache::loncommon::start_data_table()
                 .&Apache::loncommon::start_data_table_header_row()
                 .'<th>'.&mt('Discussion Boards').'</th>'
                 .&Apache::loncommon::end_data_table_header_row()
        );
        foreach my $board (@{$groupboards}) {
            my $board_url = $$boards{$board}{'url'};
            if ($board_url =~ /\?/) {
                $board_url .= '&amp;group='.$group;
            } else {
                $board_url .= '?group='.$group;
            }
            $r->print(&Apache::loncommon::start_data_table_row()
                     .'<td>'
                     .'<a href="'.$board_url.'&amp;'.$refarg.'">'
                     .$$boards{$board}{'title'}.'</a>'
                     .'</td>'
                     .&Apache::loncommon::end_data_table_row()
            );
        }
        $r->print(&Apache::loncommon::end_data_table());
    } else {
        $r->print('<p class="LC_info">'
                 .&mt('There are currently no discussion boards in this '.$gpterm.'.',)
                 .'</p>'
        );
    }
    $r->print(&Apache::loncommon::end_page());
    return OK;
}

sub create_board {
    my ($cdom,$cnum,$group,$bbtitle) = @_;
    my ($outcome,$newurl,$idtype);
    $bbtitle=&unescape($bbtitle);
    $idtype = 'inc';
    my ($boardid,$dellock,$error) = 
        &Apache::lonnet::get_timebased_id($group,'boardids','groupboards',
                                          $cdom,$cnum);
    if ($boardid) {
         $newurl = '/adm/'.$cdom.'/'.$cnum.'/'.$boardid.'/bulletinboard';
    } else {
         return ($error,$newurl,$bbtitle,$dellock);
    }

    # need to check here if group_boards_$group.sequence is in the course
    # if not - add it as an item in group_folder_$group.sequence 
    my $allbbsmap = &Apache::longroup::get_bbfolder_url($cdom,$cnum,$group);
    if ($allbbsmap =~ m|^/uploaded|) {
        my ($errtext,$fatal)=&LONCAPA::map::mapread($allbbsmap);
        if (!$fatal) {
            my $newidx=&LONCAPA::map::getresidx($newurl);
            $LONCAPA::map::resources[$newidx]=$bbtitle.':'.$newurl.
                                                   ':false:normal:res';
            push(@LONCAPA::map::order,$newidx);
            my ($errtext,$fatal)=&LONCAPA::map::storemap($allbbsmap,1,1);
            if ($fatal) {
                $outcome = "error: failed to save discussion boards map - $errtext\n";
            } else {
                my %boardinfo = (
                  'group' => $group,
                );
                $outcome = &Apache::lonnet::put('bulletinpage_'.$boardid,
                                                \%boardinfo,$cdom,$cnum);
            }
        } 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,$newurl,$bbtitle,$dellock);
}

sub display_error {
    my ($cdom,$cnum,$group,$description,$gpterm,$ucgpterm,$bodytitle,$earlyout,
        $refarg)=@_;
    my $output = &boards_header($cdom,$cnum,$group,$description,$gpterm,
                                $ucgpterm,$bodytitle,$refarg);
    $output .= $earlyout;
    $output .= &Apache::loncommon::end_page();
    return $output;
}

sub boards_header {
    my ($cdom,$cnum,$group,$description,$gpterm,$ucgpterm,$bodytitle,$refarg,
        $jscript)=@_;
    my $output = &Apache::loncommon::start_page($bodytitle,$jscript);
    if ($refarg) {
        &Apache::lonhtmlcommon::add_breadcrumb
        ({href=>"/adm/coursegroups",
          text=>"Groups",
          title=>"View course groups"},);
    }
    my $view_permission =
          &Apache::lonnet::allowed('vcg',$env{'request.course.id'}.($env{'request.course.sec'}?'/'.$env{'request.course.sec'}:''));
    my $navmap=Apache::lonnavmaps::navmap->new();
    my $grouppagelink = &Apache::longroup::get_group_link($cdom,$cnum,$group,$navmap,$view_permission,$refarg);
    if ($grouppagelink) {
        &Apache::lonhtmlcommon::add_breadcrumb
            ({href=>$grouppagelink,
              text=>&mt('Group').": $description",
              title=>&mt("Go to group's home page"),
              no_mt=>1});
    } else {
        &Apache::lonhtmlcommon::add_breadcrumb
            ({text=>&mt('Group').": $description",
              no_mt=>1});
    }
    &Apache::lonhtmlcommon::add_breadcrumb
         ({href=>"/adm/groupboards?group=$group&amp;$refarg",
          text=>"Discussion Boards",
          title=>"Display group discussion boards"},);
    $output .= &Apache::lonhtmlcommon::breadcrumbs(&mt('Group discussion boards - [_1]',$description),
                                                   undef,undef,undef,undef,1);
    return $output;
}

1;

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>