--- loncom/interface/loncommon.pm 2005/06/06 20:31:24 1.267
+++ loncom/interface/loncommon.pm 2005/11/01 20:47:15 1.281
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# a pile of common routines
#
-# $Id: loncommon.pm,v 1.267 2005/06/06 20:31:24 www Exp $
+# $Id: loncommon.pm,v 1.281 2005/11/01 20:47:15 albertel 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(...)
@@ -1539,10 +1565,11 @@ sub authform_nochange{
kerb_def_dom => 'MSU.EDU',
@_,
);
- my $result = &mt('[_1] Do not change login data',
+ my $result = '';
return $result;
}
@@ -1574,14 +1601,15 @@ sub authform_kerberos{
my $jscall = "javascript:changed_radio('krb',$in{'formname'});";
my $result .= &mt
('[_1] Kerberos authenticated with domain [_2] '.
- '[_3] Version 4 [_4] Version 5',
- '',
- '',
- '',
- '');
+ '');
return $result;
}
@@ -1606,9 +1634,9 @@ sub authform_internal{
my $jscall = "javascript:changed_radio('int',$args{'formname'});";
my $result.=&mt
('[_1] Internally authenticated (with initial password [_2])',
- '',
- '');
return $result;
}
@@ -1633,9 +1661,9 @@ sub authform_local{
my $jscall = "javascript:changed_radio('loc',$in{'formname'});";
my $result.=&mt('[_1] Local Authentication with argument [_2]',
- '',
- '');
return $result;
}
@@ -1649,9 +1677,9 @@ sub authform_filesystem{
my $jscall = "javascript:changed_radio('fsys',$in{'formname'});";
my $result.= &mt
('[_1] Filesystem Authenticated (with initial password [_2])',
- '',
- '');
return $result;
}
@@ -1984,19 +2012,20 @@ 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};
}
@@ -2687,7 +2716,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);
@@ -2727,11 +2756,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.' | '.$roleinfo.'
';
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;
}
@@ -2878,10 +2913,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;
}
@@ -2916,6 +2948,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
@@ -2934,11 +3020,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) {
@@ -2968,6 +3053,89 @@ 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;
+ }
+ }
+ }
+ }
+ }
+ if (grep/^ow$/,@{$roles}) {
+ if ((defined($cdom)) && (defined($cnum))) {
+ my %csettings = &Apache::lonnet::get('environment',['internal.courseowner'],$cdom,$cnum);
+ if ( defined($csettings{'internal.courseowner'}) ) {
+ my $owner = $csettings{'internal.courseowner'};
+ $$users{'ow'}{$owner.':'.$cdom} = 'any';
+ }
+ }
+ }
+ }
+ return;
+}
+
+
+
+###############################################
sub get_posted_cgi {
my $r=shift;
@@ -3063,7 +3231,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) };
}
}
@@ -3551,7 +3718,7 @@ the routine &Apache::lonnet::transfer_pr
my $uniq=0;
sub get_cgi_id {
$uniq=($uniq+1)%100000;
- return (time.'_'.$uniq);
+ return (time.'_'.$$.'_'.$uniq);
}
############################################################