--- loncom/interface/lonmsgdisplay.pm 2006/04/25 19:45:50 1.12 +++ loncom/interface/lonmsgdisplay.pm 2006/04/25 21:25:13 1.15 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Routines for messaging display # -# $Id: lonmsgdisplay.pm,v 1.12 2006/04/25 19:45:50 albertel Exp $ +# $Id: lonmsgdisplay.pm,v 1.15 2006/04/25 21:25:13 albertel Exp $ # # Copyright Michigan State University Board of Trustees # @@ -338,7 +338,7 @@ ENDDISHEADER if (! defined($fullname) || $fullname eq '') { $fullname = $sname; } $r->print(''.$sname.'@'.$sdom.''.$section. + $fullname.''.$sname.':'.$sdom.''.$section. ''); } $r->print(''); @@ -359,7 +359,7 @@ sub discrit { $result.='
'.&mt('From').': '. &Apache::loncommon::aboutmewrapper( &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('. -$content{'sendername'}.'@'. +$content{'sendername'}.':'. $content{'senderdomain'}.') '.$content{'time'}. '
'.&mt('Subject').': '.$content{'subject'}. '
'.
@@ -867,7 +867,7 @@ sub compout {
 	    $r->print(''.&mt('Replying to').' '.
 		      &Apache::loncommon::aboutmewrapper(
 							 &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
-		      $content{'sendername'}.'@'.
+		      $content{'sendername'}.':'.
 		      $content{'senderdomain'}.')'.
 		      ''.
 		      ''.
@@ -960,7 +960,7 @@ sub retrieve_instructor_comments {
         next if ($content{'subject'} !~ /^Record/);
 	# &Apache::lonfeedback::newline_to_br(\$content{'message'});
 	$result.='Recorded by '.
-            $content{'sendername'}.'@'.$content{'senderdomain'}."\n";
+            $content{'sendername'}.':'.$content{'senderdomain'}."\n";
         $result.=
             &Apache::lontexconvert::msgtexconverted($content{'message'})."\n";
      }
@@ -1018,7 +1018,7 @@ sub disfacetoface {
         $result.=&mt('By').': '.
 &Apache::loncommon::aboutmewrapper(
  &Apache::loncommon::plainname($content{'sendername'},$content{'senderdomain'}),$content{'sendername'},$content{'senderdomain'}).' ('.
-$content{'sendername'}.'@'.
+$content{'sendername'}.':'.
             $content{'senderdomain'}.') '.$content{'time'}.
             '
'.
               &Apache::lontexconvert::msgtexconverted($content{'message'}).
@@ -1232,7 +1232,7 @@ sub blockstore {
         unless ( defined($cancels{$_}) ) {
             my ($newstart,$newend) = &get_dates_from_form($_);
             my $newkey = $newstart.'____'.$newend;
-            $blocking{$newkey} = $env{'user.name'}.'@'.$env{'user.domain'}.':'.$env{'form.title_'.$_};
+            $blocking{$newkey} = $env{'user.name'}.':'.$env{'user.domain'}.':'.$env{'form.title_'.$_};
         }
     }
     if ($addtotal + $modtotal > 0) {
@@ -1275,13 +1275,11 @@ sub get_blockdates {
                          $env{'course.'.$env{'request.course.id'}.'.domain'},
                          $env{'course.'.$env{'request.course.id'}.'.num'}
                          );
-    $$blockcount = keys %{$records};
-                                                                                                             
-    foreach (keys %{$records}) {
-        if ($_ eq 'error: 2 tie(GDBM) Failed while attempting dump') {
-            $$blockcount = 0;
-            last;
-        }
+    $$blockcount = keys(%{$records});
+
+    if ((keys(%{$records}))[0] =~ /^error: 2 /) {
+	$records = {};
+	$$blockcount = 0;
     }
 }
 
@@ -1319,8 +1317,8 @@ END
         my ($start,$end) = split/____/,$_;
         my $startform = &Apache::lonhtmlcommon::date_setter('blockform','startdate_'.$parmcount,$start,$onchange);
         my $endform = &Apache::lonhtmlcommon::date_setter('blockform','enddate_'.$parmcount,$end,$onchange);
-        my ($setter,$title) = split/:/,$$records{$_};
-        my ($setuname,$setudom) = split/@/,$setter;
+	
+	my ($setuname,$setudom,$title) = &parse_block_record($$records{$_});
         my $settername = &Apache::loncommon::plainname($setuname,$setudom);
         $r->print(<<"END");
        
@@ -1346,6 +1344,19 @@ END
     return $parmcount;
 }
 
+sub parse_block_record {
+    my ($record) = @_;
+    my ($setuname,$setudom,$title);
+    my @data = split(/:/,$record,3);
+    if (scalar(@data) eq 2) {
+	$title = $data[1];
+	($setuname,$setudom) = split(/@/,$data[0]);
+    } else {
+	($setuname,$setudom,$title) = @data;
+    }
+    return ($setuname,$setudom,$title);
+}
+
 sub display_addblocker_table {
     my ($r,$parmcount,$ltext) = @_;
     my $start = time;
@@ -1396,58 +1407,47 @@ END
 sub blockcheck {
     my ($setters,$startblock,$endblock) = @_;
     # Retrieve active student roles and active course coordinator/instructor roles
-    my @livecses = ();
-    my @staffcses = ();
-    $$startblock = 0;
-    $$endblock = 0;
-    foreach (keys %env) {
-        if ($_ =~ m-^user\.role\.(st|cc|in)\./(.+)$-) {
-            my $role = $1;
-            my $cse = $2;
-            $cse =~ s|/|_|;
-            if ($env{$_} =~ m/^(\d*)\.(\d*)$/) {
-                unless (($2 > 0 && $2 < time) || ($1 > time)) {
-                    if ($role eq 'st') {
-                        push @livecses, $cse;
-                    } else {
-                        unless (grep/^$cse$/,@staffcses) {
-                            push @staffcses, $cse;
-                        }
-                    }
-                }
-            }
-        } elsif ($_ =~ m-user\.role\.cr/(\w+)/(\w+)/([^/]+)\./(.+)$- ) { 
-            my $rolepriv = $env{'user.role..rolesdef_'.$3};
-        }
-    }
-    # Retrieve blocking times and identity of blocker for active courses for students.
-    if (@livecses > 0) {
-        foreach my $cse (@livecses) {
-            my ($cdom,$crs) = split/_/,$cse;
-            if ( (grep/^$cse$/,@staffcses) && ($env{'request.role'} !~ m-^st\./$cdom/$crs$-) ) {
-                next;
-            } else {
-                %{$$setters{$cse}} = ();
-                @{$$setters{$cse}{'staff'}} = ();
-                @{$$setters{$cse}{'times'}} = ();
-                my %records = &Apache::lonnet::dump('comm_block',$cdom,$crs);
-                foreach (keys %records) {
-                    if ($_ =~ m/^(\d+)____(\d+)$/) {
-                        if ($1 <= time && $2 >= time) {
-                            my ($staff,$title) = split/:/,$records{$_};
-                            push @{$$setters{$cse}{'staff'}}, $staff;
-                            push @{$$setters{$cse}{'times'}}, $_;
-                            if ( ($$startblock == 0) || ($$startblock > $1) ) {
-                                $$startblock = $1;
-                            }
-                            if ( ($$endblock == 0) || ($$endblock < $2) ) {
-                                $$endblock = $2;
-                            }
-                        }
-                    }
-                }
-            }
-        }
+    my %live_courses =
+	map { $_ => 1} &Apache::loncommon::findallcourses();
+    # FIXME should really probe for apriv, but ::allowed can only probe the 
+    #       currently active role
+    my %staff_of =
+	map { $_ => 1} &Apache::loncommon::findallcourses(['cc','in']);
+
+    # Retrieve blocking times and identity of blocker for active courses
+    # for students.
+    return if (!%live_courses);
+
+    &Apache::lonnet::logthis("hmm");
+    &Apache::lonnet::logthis(join(" ",%live_courses));
+    &Apache::lonnet::logthis(join(" ",%staff_of));
+
+    foreach my $course (keys(%live_courses)) {
+	my ($cdom,$cnum) = split(/_/,$course);
+
+	# if they are a staff member and are currently not playing student
+	next if ( $staff_of{$course} 
+		  && ($env{'request.role'} !~ m{^st\./$cdom/$cnum}));
+
+	$setters->{$course} = {};
+	$setters->{$course}{'staff'} = [];
+	$setters->{$course}{'times'} = [];
+	my %records = &Apache::lonnet::dump('comm_block',$cdom,$cnum);
+	foreach my $record (keys %records) {
+	    my ($start,$end) = ($record =~ m/^(\d+)____(\d+)$/);
+	    if ($start <= time && $end >= time) {
+		my ($staff_name,$staff_dom,$title) = 
+		    &parse_block_record($records{$record});
+		push(@{$$setters{$course}{'staff'}}, [$staff_name,$staff_dom]);
+		push(@{$$setters{$course}{'times'}}, [$start,$end]);
+		if ( ($$startblock == 0) || ($$startblock > $1) ) {
+		    $$startblock = $1;
+		}
+		if ( ($$endblock == 0) || ($$endblock < $2) ) {
+		    $$endblock = $2;
+		}
+	    }
+	}
     }
 }
 
@@ -1480,14 +1480,14 @@ END
     foreach (keys %{$setters}) {
         my %courseinfo=&Apache::lonnet::coursedescription($_);
         for (my $i=0; $i<@{$$setters{$_}{staff}}; $i++) {
-            my ($uname,$udom) = split/\@/,$$setters{$_}{staff}[$i];
+            my ($uname,$udom) = @{$$setters{$_}{staff}[$i]};
             my $fullname = &Apache::loncommon::plainname($uname,$udom);
-            my ($openblock,$closeblock) = split/____/,$$setters{$_}{times}[$i];
+            my ($openblock,$closeblock) = @{$$setters{$_}{times}[$i]};
             $openblock = &Apache::lonlocal::locallocaltime($openblock);
             $closeblock= &Apache::lonlocal::locallocaltime($closeblock);
             $r->print(''.$courseinfo{'description'}.''.
                       ''.$openblock.' to '.$closeblock.''.
-                      ''.$fullname.' ('.$uname.'@'.$udom.
+                      ''.$fullname.' ('.$uname.':'.$udom.
                       ')');
         }
     }
@@ -1719,17 +1719,17 @@ sub sendoffmail {
 	    %content=&Apache::lonmsg::unpackagemsg($message{$msgid},1);
 	    &statuschange($msgid,'replied',$folder);
 	}
-	my %toaddr=();
-	undef %toaddr;
+
+	my %toaddr;
 	if ($env{'form.sendmode'} eq 'group') {
-	    foreach (keys %env) {
-		if ($_=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
+	    foreach my $address (keys(%env)) {
+		if ($address=~/^form\.send\_to\_\&\&\&[^\&]*\&\&\&\_(.+)$/) {
 		    $toaddr{$1}='';
 		}
 	    }
 	} elsif ($env{'form.sendmode'} eq 'upload') {
-	    foreach (split(/[\n\r\f]+/,$env{'form.upfile'})) {
-		my ($rec,$txt)=split(/\s*\:\s*/,$_);
+	    foreach my $line (split(/[\n\r\f]+/,$env{'form.upfile'})) {
+		my ($rec,$txt)=split(/\s*\:\s*/,$line);
 		if ($txt) {
 		    $rec=~s/\@/\:/;
 		    $toaddr{$rec}.=$txt."\n";
@@ -1761,23 +1761,31 @@ sub sendoffmail {
             $savemsg=&Apache::lonfeedback::clear_out_html($env{'form.message'});
         }
 	
-	foreach (keys %toaddr) {
-	    my ($recuname,$recdomain)=split(/\:/,$_);
+	foreach my $address (sort(keys(%toaddr))) {
+	    my ($recuname,$recdomain)=split(/\:/,$address);
             my $msgtxt = $savemsg;
-	    if ($toaddr{$_}) { $msgtxt.='
'.$toaddr{$_}; } + if ($toaddr{$address}) { $msgtxt.='
'.$toaddr{$address}; } my @thismsg; if ((($env{'form.critmsg'}) || ($env{'form.sendbck'})) && (&Apache::lonnet::allowed('srm',$env{'request.course.id'}) || &Apache::lonnet::allowed('srm',$env{'request.course.id'}. '/'.$env{'request.course.sec'}))) { - $r->print(&mt('Sending critical message').' '.$recuname.'@'.$recdomain.': '); - @thismsg=&Apache::lonmsg::user_crit_msg($recuname,$recdomain,$msgsubj,$msgtxt, - $env{'form.sendbck'},$env{'form.permanent'}, - \$sentmessage{$_}); + $r->print(&mt('Sending critical message').' '.$recuname.':'.$recdomain.': '); + @thismsg= + &Apache::lonmsg::user_crit_msg($recuname,$recdomain, + $msgsubj,$msgtxt, + $env{'form.sendbck'}, + $env{'form.permanent'}, + \$sentmessage{$address}); } else { - $r->print(&mt('Sending').' '.$recuname.'@'.$recdomain.': '); - @thismsg=&Apache::lonmsg::user_normal_msg($recuname,$recdomain,$msgsubj,$msgtxt, - $content{'citation'},undef,undef,$env{'form.permanent'},\$sentmessage{$_}); + $r->print(&mt('Sending').' '.$recuname.':'.$recdomain.': '); + @thismsg= + &Apache::lonmsg::user_normal_msg($recuname,$recdomain, + $msgsubj,$msgtxt, + $content{'citation'}, + undef,undef, + $env{'form.permanent'}, + \$sentmessage{$address}); } if (($env{'request.course.id'}) && (($msgtype eq 'critical') || ($env{'form.sendmode'} eq 'group'))) { @@ -1789,7 +1797,6 @@ sub sendoffmail { } } } - $r->print(join(' ',@thismsg).'
'); $sendstatus.=' '.join(' ',@thismsg); } if (($env{'request.course.id'}) && (($env{'form.sendmode'} eq 'group') @@ -1813,10 +1820,11 @@ sub sendoffmail { } if ($specialresult eq 'ok') { my $record_sent; - my @recusers = (); - my @recudoms = (); - my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) = - split(/\:/,&Apache::lonnet::unescape($specialmsgid)); + my @recusers; + my @recudoms; + my ($stamp,$crssubj,$msgname,$msgdom,$msgcount,$context,$pid) = + split(/\:/,&Apache::lonnet::unescape($specialmsgid)); + foreach my $recipient (sort(keys(%toaddr))) { if ($specialmsg_status{$recipient} eq 'ok') { my $usersubj = $subj_prefix.'['.$recipient.']'; @@ -1828,15 +1836,15 @@ sub sendoffmail { &Apache::lonmsg::user_normal_msg_raw($cnum,$cdom,$subj_prefix. ' ['.$recipient.']',$msgsubj,undef, undef,undef,undef,$usermsgid,undef,undef,$specialmsgid); - my ($uname,$udom) = split/:/,$recipient; + my ($uname,$udom) = split(/:/,$recipient); push(@recusers,$uname); push(@recudoms,$udom); } } if (@recusers) { my $specialmessage; - my $sentsubj = $subj_prefix.' ('.$numspecial.' sent) '. - $msgsubj; + my $sentsubj = + $subj_prefix.' ('.$numspecial.' sent) '.$msgsubj; $sentsubj = &HTML::Entities::encode($sentsubj,'<>&"'); my $sentmsgid = &Apache::lonmsg::buildmsgid($stamp,$sentsubj,$msgname,