--- loncom/interface/loncommon.pm 2005/06/03 15:47:29 1.264 +++ loncom/interface/loncommon.pm 2005/10/04 18:49:32 1.278 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # a pile of common routines # -# $Id: loncommon.pm,v 1.264 2005/06/03 15:47:29 www Exp $ +# $Id: loncommon.pm,v 1.278 2005/10/04 18:49:32 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -152,19 +152,20 @@ BEGIN { my $designdir=$Apache::lonnet::perlvar{'lonTabDir'}.'/lonDomColors'; opendir(DIR,$designdir); while ($filename=readdir(DIR)) { + if ($filename!~/\.tab$/) { next; } my ($domain)=($filename=~/^(\w+)\./); - { - my $designfile = $designdir.'/'.$filename; - if ( open (my $fh,"<$designfile") ) { - while (<$fh>) { - next if /^\#/; - chomp; - my ($key,$val)=(split(/\=/,$_)); - if ($val) { $designhash{$domain.'.'.$key}=$val; } - } - close($fh); - } - } + { + my $designfile = $designdir.'/'.$filename; + if ( open (my $fh,"<$designfile") ) { + while (<$fh>) { + next if /^\#/; + chomp; + my ($key,$val)=(split(/\=/,$_)); + if ($val) { $designhash{$domain.'.'.$key}=$val; } + } + close($fh); + } + } } closedir(DIR); @@ -418,6 +419,31 @@ sub selectcourse_link { '","'.$udomele.'","'.$desc.'","'.$extra_element.'");'."'>".&mt('Select Course').""; } +sub check_uncheck_jscript { + my $jscript = <<"ENDSCRT"; +function checkAll(field) { + if (field.length > 0) { + for (i = 0; i < field.length; i++) { + field[i].checked = true ; + } + } else { + field.checked = true + } +} + +function uncheckAll(field) { + if (field.length > 0) { + for (i = 0; i < field.length; i++) { + field[i].checked = false ; + } } else { + field.checked = false ; + } +} +ENDSCRT + return $jscript; +} + + =pod =item * linked_select_forms(...) @@ -683,8 +709,8 @@ sub help_open_menu { my $template; if ($text ne "") { $template .= - "". - "
$text"; + "". + "'.$roleinfo.'
$text"; } my $nothing=&Apache::lonhtmlcommon::javascript_nothing(); my $html=&Apache::lonxml::xmlbegin(); @@ -1984,24 +2010,23 @@ sub syllabuswrapper { } sub track_student_link { - my ($linktext,$sname,$sdom,$target) = @_; - my $link ="/adm/trackstudent"; + my ($linktext,$sname,$sdom,$target,$start) = @_; + my $link ="/adm/trackstudent?"; my $title = 'View recent activity'; if (defined($sname) && $sname !~ /^\s*$/ && defined($sdom) && $sdom !~ /^\s*$/) { - $link .= "?selected_student=$sname:$sdom"; + $link .= "selected_student=$sname:$sdom"; $title .= ' of this student'; - } + } if (defined($target) && $target !~ /^\s*$/) { $target = qq{target="$target"}; } else { $target = ''; } + if ($start) { $link.='&start='.$start; } return qq{$linktext}; } - - =pod =back @@ -2689,7 +2714,7 @@ other decorations will be returned. =cut sub bodytag { - my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle)=@_; + my ($title,$function,$addentries,$bodyonly,$domain,$forcereg,$customtitle,$notopbar)=@_; $title=&mt($title); $function = &get_users_function() if (!$function); my $img=&designparm($function.'.img',$domain); @@ -2729,11 +2754,9 @@ a:focus { color: red; background: yellow END + &Apache::lontexconvert::jsMath_reset(); if ($env{'environment.texengine'} eq 'jsMath') { - $bodytag.=''."\n". - ''."\n"; + $bodytag.=&Apache::lontexconvert::jsMath_header(); } my $upperleft=''. - '
'. + '
'. $titleinfo.'
'; if ($env{'request.state'} eq 'construct') { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg,$titletable); + if ($notopbar) { + $bodytag .= $titletable; + } else { + $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg,$titletable); + } } else { - $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg). + if ($notopbar) { + $bodytag .= $titletable; + } else { + $bodytag .= &Apache::lonmenu::menubuttons($forcereg,'web',$forcereg). $titletable; + } } return $bodytag; } @@ -2880,10 +2911,7 @@ Returns: A uniform footer for LON-CAPA w sub endbodytag { my $endbodytag=''; - if ($env{'environment.texengine'} eq 'jsMath') { - $endbodytag=''. - "\n".$endbodytag; - } + $endbodytag=&Apache::lontexconvert::jsMath_process()."\n".$endbodytag; return $endbodytag; } @@ -2918,6 +2946,60 @@ sub get_users_function { =pod +=item check_user_status + +Determines current status of supplied role for a +specific user. Roles can be active, previous or future. + +Inputs: +user's domain, user's username, course's domain, +course's number, optional section/group. + +Outputs: +role status: active, previous or future. + +=cut + +sub check_user_status { + my ($udom,$uname,$cdom,$crs,$role,$secgrp) = @_; + my %userinfo = &Apache::lonnet::dump('roles',$udom,$uname); + my @uroles = keys %userinfo; + my $srchstr; + my $active_chk = 'none'; + if (@uroles > 0) { + if (($role eq 'cc') || ($secgrp eq '') || (!defined($secgrp))) { + $srchstr = '/'.$cdom.'/'.$crs.'_'.$role; + } else { + $srchstr = '/'.$cdom.'/'.$crs.'/'.$secgrp.'_'.$role; } + if (grep/^$srchstr$/,@uroles) { + my $role_end = 0; + my $role_start = 0; + $active_chk = 'active'; + if ($userinfo{$srchstr} =~ m/^($role)_(\d+)/) { + $role_end = $2; + if ($userinfo{$srchstr} =~ m/^($role)_($role_end)_(\d+)$/) { + $role_start = $3; + } + } + if ($role_start > 0) { + if (time < $role_start) { + $active_chk = 'future'; + } + } + if ($role_end > 0) { + if (time > $role_end) { + $active_chk = 'previous'; + } + } + } + } + return $active_chk; +} + +############################################### + +=pod + =item get_sections Determines all the sections for a course including @@ -2936,11 +3018,10 @@ Returns number of sections. sub get_sections { my ($cdom,$cnum,$sectioncount,$possible_roles) = @_; if (!($cdom && $cnum)) { return 0; } - my $cid = $cdom.'_'.$cnum; my $numsections = 0; if (!defined($possible_roles) || (grep/^st$/,@$possible_roles)) { - my ($classlist) = &Apache::loncoursedata::get_classlist($cid,$cdom,$cnum); + my ($classlist) = &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) { @@ -2970,6 +3051,80 @@ sub get_sections { return $numsections; } +############################################### + +=pod + +=item get_course_users + +Retrieves usernames:domains for users in the specified course +with specific role(s), and access status. + +Incoming parameters: +1. course domain +2. course number +3. access status: users must have - either active, +previous, future, or all. +4. reference to array of permissible roles +5. reference to results object (hash of hashes). +Keys of top level hash are roles. +Keys of inner hashes are username:domain, with +values set to access type. + +=cut + +############################################### + +sub get_course_users { + my ($cdom,$cnum,$types,$roles,$users) = @_; + if (grep/^st$/,@{$roles}) { + my $statusidx = &Apache::loncoursedata::CL_STATUS(); + my $startidx = &Apache::loncoursedata::CL_START(); + my $endidx = &Apache::loncoursedata::CL_END(); + my ($classlist,$keylist)=&Apache::loncoursedata::get_classlist($cdom,$cnum); + my $now = time; + foreach my $student (keys(%{$classlist})) { + if (defined($$types{'active'})) { + if ($$classlist{$student}[$statusidx] eq 'Active') { + push(@{$$users{st}{$student}},'active'); + } + } + if (defined($$types{'previous'})) { + if ($$classlist{$student}[$endidx] <= $now) { + push(@{$$users{st}{$student}},'previous'); + } + } + if (defined($$types{'future'})) { + if (($$classlist{$student}[$startidx] > $now) && ($$classlist{$student}[$endidx] > $now) || ($$classlist{$student}[$endidx] == 0) || ($$classlist{$student}[$endidx] eq '')) { + push(@{$$users{st}{$student}},'future'); + } + } + } + } + if ((@{$roles} > 0) && (@{$roles} ne "st")) { + my @coursepersonnel = &Apache::lonnet::getkeys('nohist_userroles',$cdom,$cnum); + foreach my $person (@coursepersonnel) { + my ($role,$user) = ($person =~ /^([^:]*):([^:]+:[^:]+)/); + $user =~ s/:$//; + if (($role) && (grep(/^$role$/,@{$roles}))) { + my ($uname,$udom) = split(/:/,$user); + if ($uname ne '' && $udom ne '') { + my $status = &check_user_status($udom,$uname,$cdom,$cnum,$role); + foreach my $type (keys(%{$types})) { + if ($status eq $type) { + $$users{$role}{$user} = $type; + } + } + } + } + } + } + return; +} + + + +############################################### sub get_posted_cgi { my $r=shift; @@ -3065,7 +3220,6 @@ sub get_unprocessed_cgi { if (!defined($possible_names) || (grep {$_ eq $name} @$possible_names)) { $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; - &Apache::lonxml::debug("Seting :$name: to :$value:"); unless (defined($env{'form.'.$name})) { &add_to_env('form.'.$name,$value) }; } }