[LON-CAPA-cvs] cvs: loncom /interface groupboards.pm

raeburn lon-capa-cvs@mail.lon-capa.org
Sat, 08 Jul 2006 01:07:35 -0000


raeburn		Fri Jul  7 21:07:35 2006 EDT

  Modified files:              
    /loncom/interface	groupboards.pm 
  Log:
  Adding breadcrumb trail for group discussion boards display. Also putting groupID in bulletinpage_$boardid when creating group.  This is used by lonbulletin.pm to determine which group a group bulletin board belongs to for the purposes of privileges checking.  This setting is currently unchanged when a group board is moved from one group's folder to another using DOCS (could cause some confusion). Some sanity checking could be in order here (e.g., checking identity of enclosing map).  Still need to add locking device to prevent possible namespace collision when new boards are created.
  
  
Index: loncom/interface/groupboards.pm
diff -u loncom/interface/groupboards.pm:1.4 loncom/interface/groupboards.pm:1.5
--- loncom/interface/groupboards.pm:1.4	Fri Jun 30 14:27:19 2006
+++ loncom/interface/groupboards.pm	Fri Jul  7 21:07:34 2006
@@ -30,7 +30,6 @@
 use Apache::Constants qw(:common :http);
 use Apache::loncommon;
 use Apache::lonnet;
-use Apache::lonnavmaps;
 use Apache::lonuserstate;
 use Apache::lonratedt;
 use Apache::lonlocal;
@@ -58,21 +57,48 @@
     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 = &mt('[_1] Discussion Boards',$crstype);
     my $group = $env{'form.group'};
+    $group =~ s/\W//g;
+    my ($description,$earlyout);
+
+    &Apache::lonhtmlcommon::clear_breadcrumbs();
     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());
+        $earlyout = &mt('No [_1] defined, so there are no [_1] discussion boards to display',$gpterm);
+        $r->print(&display_error($cdom,$cnum,$group,$description,$gpterm,
+                                 $ucgpterm,$bodytitle,$earlyout));
+        return OK;
+    }
+    my %curr_groups = &Apache::longroup::coursegroups($cdom,$cnum,$group);
+    if (!defined($curr_groups{$group})) {
+        $earlyout = &mt('Invalid [_1]',$gpterm);
+        $r->print(&display_error($cdom,$cnum,$group,$description,$gpterm,
+                                 $ucgpterm,$bodytitle,$earlyout));
         return OK;
     }
+    my %content = &Apache::longroup::get_group_settings($curr_groups{$group});
+    my $description = &unescape($content{'description'});
+
     my $can_create=&Apache::lonnet::allowed('cgb',$env{'request.course.id'}.
                                             '/'.$group);
-    my $can_view=&Apache::lonnet::allowed('pgd',$env{'request.course.id'}.
+    my $can_view = &Apache::lonnet::allowed('vcg',$env{'request.course.id'});
+
+    if (!$can_view) {
+        $can_view = &Apache::lonnet::allowed('pgd',$env{'request.course.id'}.
                                           '/'.$group);
+    }
+    if (!$can_view) {
+        $earlyout=&mt('You do not have privileges to view discussion boards in this [_1]',$gpterm);
+        $r->print(&display_error($cdom,$cnum,$group,$description,$gpterm,
+                                 $ucgpterm,$bodytitle,$earlyout));
+        return OK;
+    }
     if (defined($env{'form.newbul'})) {
         if (($can_create) || (&Apache::lonnet::allowed('mdg',$env{'request.course.id'}))) {
-            $r->print(&Apache::loncommon::start_page($bodytitle));
+            $r->print(&boards_header($cdom,$cnum,$group,$description,$gpterm,
+                                     $ucgpterm,$bodytitle));
             my ($outcome,$newurl,$bbtitle) = 
 		&create_board($cdom,$cnum,$group,$env{'form.newbul'});
             if ($outcome eq 'ok') {
@@ -96,6 +122,7 @@
     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) {
@@ -104,20 +131,15 @@
     this.document.forms.newbb.submit();
    }
 }
+</script>
 |;
     }
-    $r->print(&Apache::loncommon::start_page($bodytitle,
-                                       '<script type="text/javascript">'.
-                                       $jscript.'</script>'));
-    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();
+    $r->print(&boards_header($cdom,$cnum,$group,$description,$gpterm,$ucgpterm,
+                             $bodytitle,$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('<form method="post" name="newbb" action="/adm/groupboards">'.
+        $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".
@@ -126,11 +148,18 @@
                   "\n".'</form><br />');
     }
     if (@{$groupboards} > 0) {
+        $r->print('<br />');
         foreach my $board (@{$groupboards}) {
-            $r->print('<a href="'.$$boards{$board}{'url'}.'?group='.$group.'">'.$$boards{$board}{'title'}.'</a><br />');
+            my $board_url = $$boards{$board}{'url'};
+            if ($board_url =~ /\?/) {
+                $board_url .= '&amp;group='.$group;
+            } else {
+                $board_url .= '?group='.$group;
+            }
+            $r->print('<a href="'.$board_url.'">'.$$boards{$board}{'title'}.'</a><br />');
         }
     } else {
-        $r->print(&mt('There are currently no discussion boards in this [_1].',
+        $r->print('<br />'.&mt('There are currently no discussion boards in this [_1].',
                       $gpterm));
     }
     $r->print(&Apache::loncommon::end_page());
@@ -140,10 +169,15 @@
 sub create_board {
     my ($cdom,$cnum,$group,$newboard) = @_;
     my ($bbtitle,$newurl)=split(/\=/,$newboard);
+    my $outcome;
+    my ($boardid) = ($newurl =~ m-/adm/\Q$cdom\E/\Q$cnum\E/(\d+)/bulletinboard-);
+    if (!$boardid) {
+        $outcome = ('error: the URL for new board was invalid');
+        return ($outcome,$newurl,$bbtitle);
+    }
     $bbtitle=&unescape($bbtitle);
     $newurl=&unescape($newurl);
     my $allbbsmap = &Apache::longroup::get_bbfolder_url($cdom,$cnum,$group);
-    my ($outcome);
     if ($allbbsmap =~ m|^/uploaded|) {
         my ($errtext,$fatal)=&Apache::lonratedt::mapread($allbbsmap);
         if (!$fatal) {
@@ -155,7 +189,11 @@
             if ($fatal) {
                 $outcome = "error: failed to store discussion boards map - $errtext\n";
             } else {
-                $outcome = 'ok';
+                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";
@@ -167,4 +205,27 @@
     return ($outcome,$newurl,$bbtitle);
 }
 
+sub display_error {
+    my ($cdom,$cnum,$group,$description,$gpterm,$ucgpterm,$bodytitle,$earlyout)=@_;
+    my $output = &boards_header($cdom,$cnum,$group,$description,$gpterm,
+                                $ucgpterm,$bodytitle);
+    $output .= $earlyout;
+    $output .= &Apache::loncommon::end_page();
+    return $output;
+}
+
+sub boards_header {
+    my ($cdom,$cnum,$group,$description,$gpterm,$ucgpterm,$bodytitle,$jscript)=@_;
+    my $output = &Apache::loncommon::start_page($bodytitle,$jscript);
+    &Apache::lonhtmlcommon::add_breadcrumb
+        ({href=>"/adm/$cdom/$cnum/$group/smppg",
+          text=>"$ucgpterm: $description",
+          title=>"Go to group's home page"},
+         {href=>"/adm/groupboards?group=$group",
+          text=>"Discussion Boards",
+          title=>"Display group discussion boards"},);
+    $output .= &Apache::lonhtmlcommon::breadcrumbs(&mt('[_1] discussion boards - [_2]',$gpterm,$description));
+    return $output;
+}
+
 1;