version 1.140, 2012/08/21 01:50:34
|
version 1.195, 2019/04/29 22:19:24
|
Line 30
|
Line 30
|
|
|
package Apache::lonuserutils; |
package Apache::lonuserutils; |
|
|
|
=pod |
|
|
|
=head1 NAME |
|
|
|
Apache::lonuserutils.pm |
|
|
|
=head1 SYNOPSIS |
|
|
|
Utilities for management of users and custom roles |
|
|
|
Provides subroutines called by loncreateuser.pm |
|
|
|
=head1 OVERVIEW |
|
|
|
=cut |
|
|
use strict; |
use strict; |
use Apache::lonnet; |
use Apache::lonnet; |
use Apache::loncommon(); |
use Apache::loncommon(); |
use Apache::lonhtmlcommon; |
use Apache::lonhtmlcommon; |
use Apache::lonlocal; |
use Apache::lonlocal; |
use Apache::longroup; |
use Apache::longroup; |
|
use HTML::Entities; |
use LONCAPA qw(:DEFAULT :match); |
use LONCAPA qw(:DEFAULT :match); |
|
|
############################################################### |
############################################################### |
Line 237 sub domain_roles_select {
|
Line 254 sub domain_roles_select {
|
# Role types |
# Role types |
my @roletypes = ('domain','author','course','community'); |
my @roletypes = ('domain','author','course','community'); |
my %lt = &role_type_names(); |
my %lt = &role_type_names(); |
|
my $onchangefirst = "updateCols('showrole')"; |
|
my $onchangesecond = "updateCols('showrole')"; |
# |
# |
# build up the menu information to be passed to |
# build up the menu information to be passed to |
# &Apache::loncommon::linked_select_forms |
# &Apache::loncommon::linked_select_forms |
Line 283 sub domain_roles_select {
|
Line 302 sub domain_roles_select {
|
my $result = &Apache::loncommon::linked_select_forms |
my $result = &Apache::loncommon::linked_select_forms |
('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'}, |
('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'}, |
'roletype','showrole',\%select_menus, |
'roletype','showrole',\%select_menus, |
['domain','author','course','community']); |
['domain','author','course','community'],$onchangefirst, |
|
$onchangesecond); |
return $result; |
return $result; |
} |
} |
|
|
Line 335 sub print_upload_manager_header {
|
Line 355 sub print_upload_manager_header {
|
$env{'request.role.domain'},$context, |
$env{'request.role.domain'},$context, |
$groupslist,$crstype); |
$groupslist,$crstype); |
my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); |
my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); |
$r->print('<p>' |
$r->print( |
.&mt('Total number of records found in file: [_1]' |
'<h3>'.&mt('Identify fields in uploaded list')."</h3>\n". |
,'<b>'.$distotal.'</b>') |
'<p class="LC_info">'. |
."</p>\n"); |
&mt('Total number of records found in file: [_1]' |
$r->print('<div class="LC_left_float"><h3>'. |
,'<b>'.$distotal.'</b>'). |
&mt('Identify fields in uploaded list')."</h3>\n"); |
"</p>\n" |
$r->print(&mt('Enter as many fields as you can.<br /> The system will inform you and bring you back to this page, <br /> if the data selected are insufficient to add users.')."<br />\n"); |
); |
|
if ($distotal == 0) { |
|
$r->print('<p class="LC_warning">'.&mt('None found').'</p>'); |
|
} |
|
$r->print( |
|
'<p>'. |
|
&mt('Enter as many fields as you can.').'<br />'. |
|
&mt('The system will inform you and bring you back to this page,[_1]if the data selected are insufficient to add users.','<br />'). |
|
"</p>\n" |
|
); |
$r->print(&hidden_input('action','upload'). |
$r->print(&hidden_input('action','upload'). |
&hidden_input('state','got_file'). |
&hidden_input('state','got_file'). |
&hidden_input('associate',''). |
&hidden_input('associate',''). |
Line 349 sub print_upload_manager_header {
|
Line 378 sub print_upload_manager_header {
|
&hidden_input('fileupload',$env{'form.fileupload'}). |
&hidden_input('fileupload',$env{'form.fileupload'}). |
&hidden_input('upfiletype',$env{'form.upfiletype'}). |
&hidden_input('upfiletype',$env{'form.upfiletype'}). |
&hidden_input('upfile_associate',$env{'form.upfile_associate'})); |
&hidden_input('upfile_associate',$env{'form.upfile_associate'})); |
$r->print('<br /><label><input type="checkbox" name="noFirstLine"'.$checked.' />'. |
$r->print( |
&mt('Ignore First Line').'</label><br />'); |
'<div class="LC_left_float">'. |
$r->print('<br /><input type="button" value="'.&mt('Reverse Association').'" '. |
'<fieldset><legend>'.&mt('Functions').'</legend>'. |
|
'<label><input type="checkbox" name="noFirstLine"'.$checked.' />'. |
|
&mt('Ignore First Line').'</label>'. |
|
' <input type="button" value="'.&mt('Reverse Association').'" '. |
'name="Reverse Association" '. |
'name="Reverse Association" '. |
'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'); |
'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'. |
$r->print("<br /><br />\n". |
'</fieldset></div><br clear="all" />' |
'<script type="text/javascript" language="Javascript">'."\n". |
); |
'// <![CDATA['."\n". |
$r->print( |
$javascript."\n".$javascript_validations."\n". |
'<script type="text/javascript" language="Javascript">'."\n". |
'// ]]>'."\n". |
'// <![CDATA['."\n". |
'</script>'); |
$javascript."\n".$javascript_validations."\n". |
|
'// ]]>'."\n". |
|
'</script>' |
|
); |
} |
} |
|
|
############################################################### |
############################################################### |
Line 381 sub javascript_validations {
|
Line 416 sub javascript_validations {
|
$param{'curr_autharg'} = $curr_authfield; |
$param{'curr_autharg'} = $curr_authfield; |
} |
} |
|
|
|
my $showcredits; |
|
my %domdefaults = &Apache::lonnet::get_domain_defaults($domain); |
|
if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'}) { |
|
$showcredits = 1; |
|
} |
|
|
my ($setsection_call,$setsections_js); |
my ($setsection_call,$setsections_js); |
my $finish = " vf.submit();\n"; |
my $finish = " vf.submit();\n"; |
if ($mode eq 'upload') { |
if ($mode eq 'upload') { |
Line 390 sub javascript_validations {
|
Line 431 sub javascript_validations {
|
$setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');'; |
$setsection_call = 'setSections(document.'.$param{'formname'}.",'$crstype'".');'; |
$setsections_js = |
$setsections_js = |
&setsections_javascript($param{'formname'},$groupslist, |
&setsections_javascript($param{'formname'},$groupslist, |
$mode,'',$crstype); |
$mode,'',$crstype,$showcredits); |
} else { |
} else { |
$setsection_call = "'ok'"; |
$setsection_call = "'ok'"; |
} |
} |
} elsif ($context eq 'domain') { |
} elsif ($context eq 'domain') { |
$setsection_call = 'setCourse()'; |
$setsection_call = 'setCourse()'; |
$setsections_js = &dc_setcourse_js($param{'formname'},$mode,$context); |
$setsections_js = &dc_setcourse_js($param{'formname'},$mode, |
|
$context,$showcredits); |
} |
} |
$finish = " var checkSec = $setsection_call\n". |
$finish = " var checkSec = $setsection_call\n". |
" if (checkSec == 'ok') {\n". |
" if (checkSec == 'ok') {\n". |
Line 419 sub javascript_validations {
|
Line 461 sub javascript_validations {
|
domain => 'The optional domain field was not specified.', |
domain => 'The optional domain field was not specified.', |
continue => 'Continue adding users?', |
continue => 'Continue adding users?', |
); |
); |
|
if ($showcredits) { |
|
$alert{'credits'} = &mt('The optional credits field was not specified'); |
|
} |
if (($mode eq 'upload') && ($context eq 'domain')) { |
if (($mode eq 'upload') && ($context eq 'domain')) { |
$alert{'inststatus'} = &mt('The optional affiliation field was not specified'); |
$alert{'inststatus'} = &mt('The optional affiliation field was not specified'); |
} |
} |
|
&js_escape(\%alert); |
my $function_name = <<"END"; |
my $function_name = <<"END"; |
$setsections_js |
$setsections_js |
|
|
function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus) { |
function verify_message (vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits) { |
END |
END |
my ($authnum,%can_assign) = &Apache::loncommon::get_assignable_auth($domain); |
my ($authnum,%can_assign) = &Apache::loncommon::get_assignable_auth($domain); |
my $auth_checks; |
my $auth_checks; |
Line 482 END
|
Line 528 END
|
return; |
return; |
} |
} |
} |
} |
|
/* regexp here to check for non \d \. in credits */ |
END |
END |
} else { |
} else { |
$auth_checks .= (<<END); |
$auth_checks .= (<<END); |
Line 499 END
|
Line 546 END
|
case 'fsys': |
case 'fsys': |
alertmsg = ''; |
alertmsg = ''; |
break; |
break; |
|
case 'lti': |
default: |
default: |
alertmsg = ''; |
alertmsg = ''; |
} |
} |
Line 554 END
|
Line 602 END
|
message+='$alert{'domain'}'; |
message+='$alert{'domain'}'; |
} |
} |
END |
END |
|
if ($showcredits) { |
|
$optional_checks .= <<END; |
|
if (foundcredits==0) { |
|
if (message!='') { |
|
message+='\\n'; |
|
} |
|
message+='$alert{'credits'}'; |
|
} |
|
END |
|
} |
if (($mode eq 'upload') && ($context eq 'domain')) { |
if (($mode eq 'upload') && ($context eq 'domain')) { |
$optional_checks .= (<<END); |
$optional_checks .= (<<END); |
|
|
Line 603 sub upload_manager_javascript_forward_as
|
Line 661 sub upload_manager_javascript_forward_as
|
$numbuttons ++; |
$numbuttons ++; |
} |
} |
if (!$can_assign->{'int'}) { |
if (!$can_assign->{'int'}) { |
my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.\n'). |
my $warning = &mt('You may not specify an initial password for each user, as this is only available when new users use LON-CAPA internal authentication.')."\n". |
&mt('Your current role does not have rights to create users with that authentication type.'); |
&mt('Your current role does not have rights to create users with that authentication type.'); |
|
&js_escape(\$warning); |
$auth_update = <<"END"; |
$auth_update = <<"END"; |
// Currently the initial password field is only supported for internal auth |
// Currently the initial password field is only supported for internal auth |
// (see bug 6368). |
// (see bug 6368). |
Line 638 function verify(vf,sec_caller) {
|
Line 697 function verify(vf,sec_caller) {
|
var foundrole=0; |
var foundrole=0; |
var founddomain=0; |
var founddomain=0; |
var foundinststatus=0; |
var foundinststatus=0; |
|
var foundcredits=0; |
var tw; |
var tw; |
for (i=0;i<=vf.nfields.value;i++) { |
for (i=0;i<=vf.nfields.value;i++) { |
tw=eval('vf.f'+i+'.selectedIndex'); |
tw=eval('vf.f'+i+'.selectedIndex'); |
Line 650 function verify(vf,sec_caller) {
|
Line 710 function verify(vf,sec_caller) {
|
if (tw==11) { foundrole=1; } |
if (tw==11) { foundrole=1; } |
if (tw==12) { founddomain=1; } |
if (tw==12) { founddomain=1; } |
if (tw==13) { foundinststatus=1; } |
if (tw==13) { foundinststatus=1; } |
|
if (tw==14) { foundcredits=1; } |
} |
} |
verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus); |
verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits); |
} |
} |
|
|
// |
// |
Line 674 function verify(vf,sec_caller) {
|
Line 735 function verify(vf,sec_caller) {
|
// 11 = role |
// 11 = role |
// 12 = domain |
// 12 = domain |
// 13 = inststatus |
// 13 = inststatus |
|
// 14 = foundcredits |
|
|
function flip(vf,tf) { |
function flip(vf,tf) { |
var nw=eval('vf.f'+tf+'.selectedIndex'); |
var nw=eval('vf.f'+tf+'.selectedIndex'); |
Line 739 sub upload_manager_javascript_reverse_as
|
Line 801 sub upload_manager_javascript_reverse_as
|
if (!$can_assign->{'int'}) { |
if (!$can_assign->{'int'}) { |
my $warning = &mt('You may not specify an initial password, as this is only available when new users use LON-CAPA internal authentication.\n'). |
my $warning = &mt('You may not specify an initial password, as this is only available when new users use LON-CAPA internal authentication.\n'). |
&mt('Your current role does not have rights to create users with that authentication type.'); |
&mt('Your current role does not have rights to create users with that authentication type.'); |
|
&js_escape(\$warning); |
$auth_update = <<"END"; |
$auth_update = <<"END"; |
// Currently the initial password field is only supported for internal auth |
// Currently the initial password field is only supported for internal auth |
// (see bug 6368). |
// (see bug 6368). |
Line 771 function verify(vf,sec_caller) {
|
Line 834 function verify(vf,sec_caller) {
|
var foundrole=0; |
var foundrole=0; |
var founddomain=0; |
var founddomain=0; |
var foundinststatus=0; |
var foundinststatus=0; |
|
var foundcredits=0; |
var tw; |
var tw; |
for (i=0;i<=vf.nfields.value;i++) { |
for (i=0;i<=vf.nfields.value;i++) { |
tw=eval('vf.f'+i+'.selectedIndex'); |
tw=eval('vf.f'+i+'.selectedIndex'); |
Line 783 function verify(vf,sec_caller) {
|
Line 847 function verify(vf,sec_caller) {
|
if (i==10 && tw!=0) { foundrole=1; } |
if (i==10 && tw!=0) { foundrole=1; } |
if (i==11 && tw!=0) { founddomain=1; } |
if (i==11 && tw!=0) { founddomain=1; } |
if (i==12 && tw!=0) { foundinstatus=1; } |
if (i==12 && tw!=0) { foundinstatus=1; } |
|
if (i==13 && tw!=0) { foundcredits=1; } |
} |
} |
verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus); |
verify_message(vf,founduname,foundpwd,foundname,foundid,foundsec,foundemail,foundrole,founddomain,foundinststatus,foundcredits); |
} |
} |
|
|
function flip(vf,tf) { |
function flip(vf,tf) { |
Line 816 ENDPICK
|
Line 881 ENDPICK
|
############################################################### |
############################################################### |
############################################################### |
############################################################### |
sub print_upload_manager_footer { |
sub print_upload_manager_footer { |
my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission,$crstype) = @_; |
my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission,$crstype, |
|
$showcredits) = @_; |
my $form = 'document.studentform'; |
my $form = 'document.studentform'; |
my $formname = 'studentform'; |
my $formname = 'studentform'; |
my ($krbdef,$krbdefdom) = |
my ($krbdef,$krbdefdom) = |
Line 833 sub print_upload_manager_footer {
|
Line 899 sub print_upload_manager_footer {
|
my $krbform = &Apache::loncommon::authform_kerberos(%param); |
my $krbform = &Apache::loncommon::authform_kerberos(%param); |
my $intform = &Apache::loncommon::authform_internal(%param); |
my $intform = &Apache::loncommon::authform_internal(%param); |
my $locform = &Apache::loncommon::authform_local(%param); |
my $locform = &Apache::loncommon::authform_local(%param); |
|
my $ltiform = &Apache::loncommon::authform_lti(%param); |
my $date_table = &date_setting_table(undef,undef,$context,undef, |
my $date_table = &date_setting_table(undef,undef,$context,undef, |
$formname,$permission,$crstype); |
$formname,$permission,$crstype); |
|
|
Line 861 sub print_upload_manager_footer {
|
Line 928 sub print_upload_manager_footer {
|
&Apache::loncommon::help_open_topic('Auth_Options'). |
&Apache::loncommon::help_open_topic('Auth_Options'). |
"</p>\n"; |
"</p>\n"; |
} |
} |
$Str .= &set_login($defdom,$krbform,$intform,$locform); |
$Str .= &set_login($defdom,$krbform,$intform,$locform,$ltiform); |
|
|
my ($home_server_pick,$numlib) = |
my ($home_server_pick,$numlib) = |
&Apache::loncommon::home_server_form_item($defdom,'lcserver', |
&Apache::loncommon::home_server_form_item($defdom,'lcserver', |
Line 878 sub print_upload_manager_footer {
|
Line 945 sub print_upload_manager_footer {
|
&Apache::lonhtmlcommon::row_closure(); |
&Apache::lonhtmlcommon::row_closure(); |
} |
} |
|
|
|
my ($trusted,$untrusted); |
|
if ($context eq 'course') { |
|
($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$defdom); |
|
} elsif ($context eq 'author') { |
|
($trusted,$untrusted) = &Apache::lonnet::trusted_domains('othcoau',$defdom); |
|
} |
$Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain')) |
$Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain')) |
.&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1) |
.&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1,undef,$trusted,$untrusted) |
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure(); |
|
|
$Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates')) |
$Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates')) |
Line 905 sub print_upload_manager_footer {
|
Line 978 sub print_upload_manager_footer {
|
&mt('Default role')) |
&mt('Default role')) |
.&mt('Choose the role to assign to users without a value specified in the uploaded file.') |
.&mt('Choose the role to assign to users without a value specified in the uploaded file.') |
} elsif ($context eq 'course') { |
} elsif ($context eq 'course') { |
$Str .= &Apache::lonhtmlcommon::row_title( |
if ($showcredits) { |
|
$Str .= &Apache::lonhtmlcommon::row_title( |
|
&mt('Default role, section and credits')) |
|
.&mt('Choose the role and/or section(s) and/or credits to assign to users without values specified in the uploaded file.'); |
|
} else { |
|
$Str .= &Apache::lonhtmlcommon::row_title( |
&mt('Default role and section')) |
&mt('Default role and section')) |
.&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.'); |
.&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.'); |
|
} |
} else { |
} else { |
$Str .= &Apache::lonhtmlcommon::row_title( |
$Str .= &Apache::lonhtmlcommon::row_title( |
&mt('Default role and/or section(s)')) |
&mt('Default role and/or section(s)')) |
Line 915 sub print_upload_manager_footer {
|
Line 994 sub print_upload_manager_footer {
|
} |
} |
if (($context eq 'domain') || ($context eq 'author')) { |
if (($context eq 'domain') || ($context eq 'author')) { |
$Str .= '<br />'; |
$Str .= '<br />'; |
my ($options,$cb_script,$coursepick) = &default_role_selector($context,1); |
my ($options,$cb_script,$coursepick) = |
|
&default_role_selector($context,1,'',$showcredits); |
if ($context eq 'domain') { |
if ($context eq 'domain') { |
$Str .= '<p>' |
$Str .= '<p>' |
.'<b>'.&mt('Domain Level').'</b><br />' |
.'<b>'.&mt('Domain Level').'</b><br />' |
Line 932 sub print_upload_manager_footer {
|
Line 1012 sub print_upload_manager_footer {
|
} else { |
} else { |
my ($cnum,$cdom) = &get_course_identity(); |
my ($cnum,$cdom) = &get_course_identity(); |
my $rowtitle = &mt('section'); |
my $rowtitle = &mt('section'); |
my $secbox = §ion_picker($cdom,$cnum,'Any',$rowtitle, |
my $defaultcredits; |
$permission,$context,'upload',$crstype); |
if ($showcredits) { |
|
$defaultcredits = &get_defaultcredits(); |
|
} |
|
my $secbox = §ion_picker($cdom,$cnum,'Any',$rowtitle,$permission, |
|
$context,'upload',$crstype,$showcredits, |
|
$defaultcredits); |
$Str .= $secbox |
$Str .= $secbox |
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure(); |
my %lt; |
my %lt; |
Line 956 sub print_upload_manager_footer {
|
Line 1041 sub print_upload_manager_footer {
|
.&Apache::lonhtmlcommon::row_closure(); |
.&Apache::lonhtmlcommon::row_closure(); |
} |
} |
if ($context eq 'course' || $context eq 'domain') { |
if ($context eq 'course' || $context eq 'domain') { |
$Str .= &forceid_change($context); |
$Str .= &Apache::lonhtmlcommon::row_title(&mt('Student/Employee ID')) |
|
.&forceid_change($context) |
|
.&Apache::lonhtmlcommon::row_closure(1); # last row in pick_box |
} |
} |
|
|
$Str .= &Apache::lonhtmlcommon::end_pick_box(); |
$Str .= &Apache::lonhtmlcommon::end_pick_box(); |
Line 979 sub print_upload_manager_footer {
|
Line 1066 sub print_upload_manager_footer {
|
return; |
return; |
} |
} |
|
|
|
sub get_defaultcredits { |
|
my ($cdom,$cnum) = @_; |
|
|
|
if ($cdom eq '' || $cnum eq '') { |
|
return unless ($env{'request.course.id'}); |
|
$cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
$cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
} |
|
return unless(($cdom =~ /^$match_domain$/) && ($cnum =~ /^$match_courseid$/)); |
|
my ($defaultcredits,$domdefcredits); |
|
my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); |
|
if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'} || $domdefaults{'textbookcredits'}) { |
|
my $instcode = $env{'course.'.$cdom.'_'.$cnum.'.internal.coursecode'}; |
|
if ($instcode) { |
|
$domdefcredits = $domdefaults{'officialcredits'}; |
|
} elsif ($env{'course.'.$cdom.'_'.$cnum.'.internal.textbook'}) { |
|
$domdefcredits = $domdefaults{'textbookcredits'}; |
|
} else { |
|
$domdefcredits = $domdefaults{'unofficialcredits'}; |
|
} |
|
} else { |
|
return; |
|
} |
|
|
|
if ($env{'request.course.id'} eq $cdom.'_'.$cnum) { |
|
$defaultcredits = $env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'}; |
|
} elsif (exists($env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'})) { |
|
$defaultcredits = $env{'course.'.$cdom.'_'.$cnum.'.internal.defaultcredits'}; |
|
} else { |
|
my %crsinfo = |
|
&Apache::lonnet::coursedescription("$cdom/$cnum",{'one_time' => 1}); |
|
$defaultcredits = $crsinfo{'internal.defaultcredits'}; |
|
} |
|
if ($defaultcredits eq '') { |
|
$defaultcredits = $domdefcredits; |
|
} |
|
return $defaultcredits; |
|
} |
|
|
sub forceid_change { |
sub forceid_change { |
my ($context) = @_; |
my ($context) = @_; |
my $output = |
my $output = |
&Apache::lonhtmlcommon::row_title(&mt('Student/Employee ID')) |
'<label><input type="checkbox" name="forceid" value="yes" />' |
.'<label><input type="checkbox" name="forceid" value="yes" />' |
.&mt('Force change of existing ID') |
.&mt('Disable Student/Employee ID Safeguard and force change of conflicting IDs') |
.'</label>'.&Apache::loncommon::help_open_topic('ForceIDChange')."\n"; |
.'</label><br />'."\n" |
|
.&mt('(only do if you know what you are doing.)')."\n"; |
|
if ($context eq 'domain') { |
if ($context eq 'domain') { |
$output .= '<br /><label><input type="checkbox" name="recurseid"'. |
$output .= |
' value="yes" />'. |
'<br />' |
&mt('Update student/employee ID in courses in which user is active/future student,[_1](if forcing change).','<br />'). |
.'<label><input type="checkbox" name="recurseid" value="yes" />' |
'</label>'."\n"; |
.&mt("Update ID in user's course(s).").'</label>'."\n"; |
} |
} |
$output .= &Apache::lonhtmlcommon::row_closure(1); # last row in pick_box |
|
return $output; |
return $output; |
} |
} |
|
|
############################################################### |
############################################################### |
############################################################### |
############################################################### |
sub print_upload_manager_form { |
sub print_upload_manager_form { |
my ($r,$context,$permission,$crstype) = @_; |
my ($r,$context,$permission,$crstype,$showcredits) = @_; |
my $firstLine; |
my $firstLine; |
my $datatoken; |
my $datatoken; |
if (!$env{'form.datatoken'}) { |
if (!$env{'form.datatoken'}) { |
$datatoken=&Apache::loncommon::upfile_store($r); |
$datatoken=&Apache::loncommon::upfile_store($r); |
} else { |
} else { |
$datatoken=$env{'form.datatoken'}; |
$datatoken=&Apache::loncommon::valid_datatoken($env{'form.datatoken'}); |
&Apache::loncommon::load_tmp_file($r); |
if ($datatoken ne '') { |
|
&Apache::loncommon::load_tmp_file($r,$datatoken); |
|
} |
|
} |
|
if ($datatoken eq '') { |
|
$r->print('<p class="LC_error">'.&mt('Error').': '. |
|
&mt('Invalid datatoken').'</p>'); |
|
return 'missingdata'; |
} |
} |
my @records=&Apache::loncommon::upfile_record_sep(); |
my @records=&Apache::loncommon::upfile_record_sep(); |
if($env{'form.noFirstLine'}){ |
if($env{'form.noFirstLine'}){ |
Line 1033 sub print_upload_manager_form {
|
Line 1163 sub print_upload_manager_form {
|
'domain_choice' => 'scalar', |
'domain_choice' => 'scalar', |
'inststatus_choice' => 'scalar', |
'inststatus_choice' => 'scalar', |
}; |
}; |
my $defdom = $env{'request.role.domain'}; |
if ($showcredits) { |
|
$col_setting_names->{'credits_choice'} = 'scalar'; |
|
} |
if ($context eq 'course') { |
if ($context eq 'course') { |
&Apache::loncommon::restore_course_settings('enrollment_upload', |
&Apache::loncommon::restore_course_settings('enrollment_upload', |
$col_setting_names); |
$col_setting_names); |
Line 1041 sub print_upload_manager_form {
|
Line 1173 sub print_upload_manager_form {
|
&Apache::loncommon::restore_settings($context,'user_upload', |
&Apache::loncommon::restore_settings($context,'user_upload', |
$col_setting_names); |
$col_setting_names); |
} |
} |
|
my $defdom = $env{'request.role.domain'}; |
# |
# |
# Determine kerberos parameters as appropriate |
# Determine kerberos parameters as appropriate |
my ($krbdef,$krbdefdom) = |
my ($krbdef,$krbdefdom) = |
Line 1066 sub print_upload_manager_form {
|
Line 1199 sub print_upload_manager_form {
|
['role',&mt('Role'), $env{'form.role_choice'}], |
['role',&mt('Role'), $env{'form.role_choice'}], |
['domain',&mt('Domain'), $env{'form.domain_choice'}], |
['domain',&mt('Domain'), $env{'form.domain_choice'}], |
['inststatus',&mt('Affiliation'), $env{'form.inststatus_choice'}]); |
['inststatus',&mt('Affiliation'), $env{'form.inststatus_choice'}]); |
|
if ($showcredits) { |
|
push(@field, |
|
['credits',&mt('Student Credits'), $env{'form.credits_choice'}]); |
|
} |
if ($env{'form.upfile_associate'} eq 'reverse') { |
if ($env{'form.upfile_associate'} eq 'reverse') { |
&Apache::loncommon::csv_print_samples($r,\@records); |
&Apache::loncommon::csv_print_samples($r,\@records); |
$i=&Apache::loncommon::csv_print_select_table($r,\@records, |
$i=&Apache::loncommon::csv_print_select_table($r,\@records, |
Line 1082 sub print_upload_manager_form {
|
Line 1219 sub print_upload_manager_form {
|
$keyfields=join(',',sort(keys(%sone))); |
$keyfields=join(',',sort(keys(%sone))); |
} |
} |
} |
} |
$r->print('</div>'); |
|
&print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear, |
&print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear, |
$context,$permission,$crstype); |
$context,$permission,$crstype,$showcredits); |
|
return 'ok'; |
} |
} |
|
|
sub setup_date_selectors { |
sub setup_date_selectors { |
Line 1241 sub make_dates_default {
|
Line 1378 sub make_dates_default {
|
} |
} |
|
|
sub default_role_selector { |
sub default_role_selector { |
my ($context,$checkpriv,$crstype) = @_; |
my ($context,$checkpriv,$crstype,$showcredits) = @_; |
my %customroles; |
my %customroles; |
my ($options,$coursepick,$cb_jscript); |
my ($options,$coursepick,$cb_jscript); |
if ($context ne 'author') { |
if ($context ne 'author') { |
Line 1253 sub default_role_selector {
|
Line 1390 sub default_role_selector {
|
'grs' => "Section", |
'grs' => "Section", |
'exs' => "Existing sections", |
'exs' => "Existing sections", |
'new' => "New section", |
'new' => "New section", |
|
'crd' => "Credits", |
); |
); |
$options = '<select name="defaultrole">'."\n". |
$options = '<select name="defaultrole">'."\n". |
' <option value="">'.&mt('Please select').'</option>'."\n"; |
' <option value="">'.&mt('Please select').'</option>'."\n"; |
Line 1272 sub default_role_selector {
|
Line 1410 sub default_role_selector {
|
} |
} |
my $courseform = &Apache::loncommon::selectcourse_link |
my $courseform = &Apache::loncommon::selectcourse_link |
('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course/Community'); |
('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course/Community'); |
|
my ($credit_elem,$creditsinput); |
|
if ($showcredits) { |
|
$credit_elem = 'credits'; |
|
$creditsinput = '<td><input type="text" name="credits" value="" /></td>'; |
|
} |
$cb_jscript = |
$cb_jscript = |
&Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform','courserole','Course/Community'); |
&Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform','courserole','Course/Community',$credit_elem); |
$coursepick = &Apache::loncommon::start_data_table(). |
$coursepick = &Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(). |
&Apache::loncommon::start_data_table_header_row(). |
'<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th>'. |
'<th>'.$courseform.'</th><th>'.$lt{'rol'}.'</th>'. |
'<th>'.$lt{'grs'}.'</th>'. |
'<th>'.$lt{'grs'}.'</th>'. |
|
'<th>'.$lt{'crd'}.'</th>'. |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::end_data_table_header_row(). |
&Apache::loncommon::start_data_table_row()."\n". |
&Apache::loncommon::start_data_table_row()."\n". |
'<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n". |
'<td><input type="text" name="coursedesc" value="" onfocus="this.blur();opencrsbrowser('."'studentform','dccourse','dcdomain','coursedesc','','','','crstype'".')" /></td>'."\n". |
Line 1285 sub default_role_selector {
|
Line 1429 sub default_role_selector {
|
&default_course_roles($context,$checkpriv,'Course',%customroles)."\n". |
&default_course_roles($context,$checkpriv,'Course',%customroles)."\n". |
'</select></td><td>'. |
'</select></td><td>'. |
'<table class="LC_createuser">'. |
'<table class="LC_createuser">'. |
'<tr class="LC_section_row"><td valign"top">'. |
'<tr class="LC_section_row"><td valign="top">'. |
$lt{'exs'}.'<br /><select name="currsec">'. |
$lt{'exs'}.'<br /><select name="currsec">'. |
' <option value=""><--'.&mt('Pick course first'). |
' <option value=""><--'.&mt('Pick course first'). |
'</select></td>'. |
'</select></td>'. |
'<td> </td>'. |
'<td> </td>'. |
'<td valign="top">'.$lt{'new'}.'<br />'. |
'<td valign="top">'.$lt{'new'}.'<br />'. |
Line 1299 sub default_role_selector {
|
Line 1443 sub default_role_selector {
|
'<input type="hidden" name="dccourse" value="" />'. |
'<input type="hidden" name="dccourse" value="" />'. |
'<input type="hidden" name="dcdomain" value="" />'. |
'<input type="hidden" name="dcdomain" value="" />'. |
'<input type="hidden" name="crstype" value="" />'. |
'<input type="hidden" name="crstype" value="" />'. |
'</td></tr></table></td>'. |
'</td></tr></table></td>'.$creditsinput. |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table_row(). |
&Apache::loncommon::end_data_table()."\n"; |
&Apache::loncommon::end_data_table()."\n"; |
} |
} |
Line 1419 sub curr_role_permissions {
|
Line 1563 sub curr_role_permissions {
|
# ======================================================= Existing Custom Roles |
# ======================================================= Existing Custom Roles |
|
|
sub my_custom_roles { |
sub my_custom_roles { |
my ($crstype) = @_; |
my ($crstype,$udom,$uname) = @_; |
my %returnhash=(); |
my %returnhash=(); |
my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1}); |
my $extra = &Apache::lonnet::freeze_escape({'skipcheck' => 1}); |
my %rolehash=&Apache::lonnet::dump('roles'); |
my %rolehash=&Apache::lonnet::dump('roles',$udom,$uname); |
foreach my $key (keys(%rolehash)) { |
foreach my $key (keys(%rolehash)) { |
if ($key=~/^rolesdef\_(\w+)$/) { |
if ($key=~/^rolesdef\_(\w+)$/) { |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
Line 1436 sub my_custom_roles {
|
Line 1580 sub my_custom_roles {
|
|
|
sub print_userlist { |
sub print_userlist { |
my ($r,$mode,$permission,$context,$formname,$totcodes,$codetitles, |
my ($r,$mode,$permission,$context,$formname,$totcodes,$codetitles, |
$idlist,$idlist_titles) = @_; |
$idlist,$idlist_titles,$showcredits) = @_; |
my $format = $env{'form.output'}; |
my $format = $env{'form.output'}; |
if (! exists($env{'form.sortby'})) { |
if (! exists($env{'form.sortby'})) { |
$env{'form.sortby'} = 'username'; |
$env{'form.sortby'} = 'username'; |
Line 1471 sub print_userlist {
|
Line 1615 sub print_userlist {
|
@statuses = ('future'); |
@statuses = ('future'); |
} |
} |
|
|
# if ($context eq 'course') { |
|
# $r->print(&display_adv_courseroles()); |
|
# } |
|
# |
|
# Interface output |
# Interface output |
$r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n". |
$r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n". |
'<input type="hidden" name="action" value="'. |
'<input type="hidden" name="action" value="'. |
Line 1512 sub print_userlist {
|
Line 1652 sub print_userlist {
|
$r->print(§ion_group_filter($cnum,$cdom)); |
$r->print(§ion_group_filter($cnum,$cdom)); |
} |
} |
$r->print('</div><div class="LC_left_float">'. |
$r->print('</div><div class="LC_left_float">'. |
&column_checkboxes($context,$mode,$formname). |
&column_checkboxes($context,$mode,$formname,$showcredits). |
'</div><br clear="all" />'); |
'</div>'); |
if ($env{'form.phase'} eq '') { |
if ($env{'form.phase'} eq '') { |
$r->print(&list_submit_button(&mt('Display List of Users'))."\n". |
$r->print('<br clear="all" />'. |
|
&list_submit_button(&mt('Display List of Users'))."\n". |
'<input type="hidden" name="phase" value="" /></form>'); |
'<input type="hidden" name="phase" value="" /></form>'); |
return; |
return; |
} |
} |
if (!(($context eq 'domain') && |
if (!(($context eq 'domain') && |
(($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) { |
(($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) { |
$r->print(&list_submit_button(&mt('Update Display'))."\n"); |
$r->print('<br clear="all" />'. |
|
&list_submit_button(&mt('Update Display'))."\n"); |
} |
} |
|
|
my @cols = &infocolumns($context,$mode); |
my @cols = &infocolumns($context,$mode,$showcredits); |
if (!@cols) { |
if (!@cols) { |
$r->print('<hr /><span class="LC_warning">'. |
$r->print('<hr style="clear:both;" /><span class="LC_warning">'. |
&mt('No user information selected for display.').'</span>'. |
&mt('No user information selected for display.').'</span>'. |
'<input type="hidden" name="phase" value="display" /></form>'."\n"); |
'<input type="hidden" name="phase" value="display" /></form>'."\n"); |
return; |
return; |
} |
} |
my ($indexhash,$keylist) = &make_keylist_array(); |
my ($indexhash,$keylist) = &make_keylist_array(); |
my (%userlist,%userinfo,$clearcoursepick); |
my (%userlist,%userinfo,$clearcoursepick,$needauthorquota,$needauthorusage); |
if (($context eq 'domain') && |
if (($context eq 'domain') && |
($env{'form.roletype'} eq 'course') || |
($env{'form.roletype'} eq 'course') || |
($env{'form.roletype'} eq 'community')) { |
($env{'form.roletype'} eq 'community')) { |
Line 1553 sub print_userlist {
|
Line 1695 sub print_userlist {
|
&Apache::lonhtmlcommon::course_selection($formname,$numcodes, |
&Apache::lonhtmlcommon::course_selection($formname,$numcodes, |
$codetitles,$idlist,$idlist_titles,$crstype, |
$codetitles,$idlist,$idlist_titles,$crstype, |
\@standardnames); |
\@standardnames); |
$r->print('<p>'.&Apache::lonhtmlcommon::start_pick_box()."\n". |
$r->print('<div class="LC_left_float">'. |
&Apache::lonhtmlcommon::start_pick_box()."\n". |
'<fieldset><legend>'.$title.'</legend>'."\n". |
&Apache::lonhtmlcommon::row_title($title,'LC_oddrow_value')."\n". |
|
$courseform."\n". |
$courseform."\n". |
&Apache::lonhtmlcommon::row_closure(1). |
'</fieldset></div><br clear="all" />'. |
&Apache::lonhtmlcommon::end_pick_box().'</p>'. |
|
'<p><input type="hidden" name="origroletype" value="'.$env{'form.roletype'}.'" />'. |
'<p><input type="hidden" name="origroletype" value="'.$env{'form.roletype'}.'" />'. |
&list_submit_button(&mt('Update Display')). |
&list_submit_button(&mt('Update Display')). |
"\n".'</p><span class="LC_warning">'.$warning.'</span>'."\n"); |
"\n".'</p><span class="LC_warning">'.$warning.'</span>'."\n"); |
Line 1568 sub print_userlist {
|
Line 1708 sub print_userlist {
|
$clearcoursepick = 1; |
$clearcoursepick = 1; |
} |
} |
if (($env{'form.coursepick'}) && (!$clearcoursepick)) { |
if (($env{'form.coursepick'}) && (!$clearcoursepick)) { |
$r->print('<hr />'.&mt('Searching').' ...<br /> <br />'); |
$r->print('<hr />'.&mt('Searching ...').'<br /> <br />'); |
} |
} |
} else { |
} else { |
$r->print('<hr /><div id="searching">'.&mt('Searching').' ...</div>'); |
$r->print('<hr style="clear:both;" /><div id="searching">'.&mt('Searching ...').'</div>'); |
} |
} |
$r->rflush(); |
$r->rflush(); |
if ($context eq 'course') { |
if ($context eq 'course') { |
Line 1606 sub print_userlist {
|
Line 1746 sub print_userlist {
|
\%cstr_roles,$permission); |
\%cstr_roles,$permission); |
} elsif ($context eq 'domain') { |
} elsif ($context eq 'domain') { |
if ($env{'form.roletype'} eq 'domain') { |
if ($env{'form.roletype'} eq 'domain') { |
|
if (grep(/^authorusage$/,@cols)) { |
|
$needauthorusage = 1; |
|
} |
|
if (grep(/^authorquota$/,@cols)) { |
|
$needauthorquota = 1; |
|
} |
%dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'}); |
%dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'}); |
foreach my $key (keys(%dom_roles)) { |
foreach my $key (keys(%dom_roles)) { |
if (ref($dom_roles{$key}) eq 'HASH') { |
if (ref($dom_roles{$key}) eq 'HASH') { |
Line 1691 sub print_userlist {
|
Line 1837 sub print_userlist {
|
} |
} |
} |
} |
if (keys(%userlist) == 0) { |
if (keys(%userlist) == 0) { |
|
my $msg = ''; |
if ($context eq 'author') { |
if ($context eq 'author') { |
$r->print(&mt('There are no co-authors to display.')."\n"); |
$msg = &mt('There are no co-authors to display.'); |
} elsif ($context eq 'domain') { |
} elsif ($context eq 'domain') { |
if ($env{'form.roletype'} eq 'domain') { |
if ($env{'form.roletype'} eq 'domain') { |
$r->print(&mt('There are no users with domain roles to display.')."\n"); |
$msg = &mt('There are no users with domain roles to display.'); |
} elsif ($env{'form.roletype'} eq 'author') { |
} elsif ($env{'form.roletype'} eq 'author') { |
$r->print(&mt('There are no authors or co-authors to display.')."\n"); |
$msg = &mt('There are no authors or co-authors to display.'); |
} elsif ($env{'form.roletype'} eq 'course') { |
} elsif ($env{'form.roletype'} eq 'course') { |
$r->print(&mt('There are no course users to display')."\n"); |
$msg = &mt('There are no course users to display'); |
} elsif ($env{'form.roletype'} eq 'community') { |
} elsif ($env{'form.roletype'} eq 'community') { |
$r->print(&mt('There are no community users to display')."\n"); |
$msg = &mt('There are no community users to display'); |
} |
} |
} elsif ($context eq 'course') { |
} elsif ($context eq 'course') { |
$r->print(&mt('There are no course users to display.')."\n"); |
$r->print(&mt('There are no course users to display.')."\n"); |
} |
} |
|
$r->print('<p class="LC_info">'.$msg.'</p>'."\n") if $msg; |
} else { |
} else { |
# Print out the available choices |
# Print out the available choices |
my $usercount; |
my $usercount; |
if ($env{'form.action'} eq 'modifystudent') { |
if ($env{'form.action'} eq 'modifystudent') { |
($usercount) = &show_users_list($r,$context,'view',$permission, |
($usercount) = &show_users_list($r,$context,'view',$permission, |
$env{'form.Status'},\%userlist,$keylist); |
$env{'form.Status'},\%userlist,$keylist,'', |
|
$showcredits); |
} else { |
} else { |
($usercount) = &show_users_list($r,$context,$env{'form.output'}, |
($usercount) = &show_users_list($r,$context,$env{'form.output'}, |
$permission,$env{'form.Status'},\%userlist,$keylist); |
$permission,$env{'form.Status'},\%userlist, |
|
$keylist,'',$showcredits,$needauthorquota,$needauthorusage); |
} |
} |
if (!$usercount) { |
if (!$usercount) { |
$r->print('<br /><span class="LC_warning">' |
$r->print('<br /><span class="LC_info">' |
.&mt('There are no users matching the search criteria.') |
.&mt('There are no users matching the search criteria.') |
.'</span>' |
.'</span>' |
); |
); |
Line 1835 sub section_group_filter {
|
Line 1985 sub section_group_filter {
|
} |
} |
|
|
sub infocolumns { |
sub infocolumns { |
my ($context,$mode) = @_; |
my ($context,$mode,$showcredits) = @_; |
my @cols; |
my @cols; |
if (($mode eq 'pickauthor') || ($mode eq 'autoenroll')) { |
if (($mode eq 'pickauthor') || ($mode eq 'autoenroll')) { |
@cols = &get_cols_array($context,$mode); |
@cols = &get_cols_array($context,$mode,$showcredits); |
} else { |
} else { |
my @posscols = &get_cols_array($context,$mode); |
my @posscols = &get_cols_array($context,$mode,$showcredits); |
if ($env{'form.phase'} ne '') { |
if ($env{'form.phase'} ne '') { |
my @checkedcols = &Apache::loncommon::get_env_multiple('form.showcol'); |
my @checkedcols = &Apache::loncommon::get_env_multiple('form.showcol'); |
foreach my $col (@checkedcols) { |
foreach my $col (@checkedcols) { |
Line 1856 sub infocolumns {
|
Line 2006 sub infocolumns {
|
} |
} |
|
|
sub get_cols_array { |
sub get_cols_array { |
my ($context,$mode) = @_; |
my ($context,$mode,$showcredits) = @_; |
my @cols; |
my @cols; |
if ($mode eq 'pickauthor') { |
if ($mode eq 'pickauthor') { |
@cols = ('username','fullname','status','email'); |
@cols = ('username','fullname','status','email'); |
Line 1866 sub get_cols_array {
|
Line 2016 sub get_cols_array {
|
push(@cols,'section'); |
push(@cols,'section'); |
} |
} |
push(@cols,('start','end','role')); |
push(@cols,('start','end','role')); |
if ($context eq 'domain') { |
|
push (@cols,'extent'); |
|
} |
|
unless (($mode eq 'autoenroll') && ($env{'form.Status'} ne 'Any')) { |
unless (($mode eq 'autoenroll') && ($env{'form.Status'} ne 'Any')) { |
push(@cols,'status'); |
push(@cols,'status'); |
} |
} |
Line 1877 sub get_cols_array {
|
Line 2024 sub get_cols_array {
|
} |
} |
push(@cols,'email'); |
push(@cols,'email'); |
if (($context eq 'course') && ($mode ne 'autoenroll')) { |
if (($context eq 'course') && ($mode ne 'autoenroll')) { |
|
if ($showcredits) { |
|
push(@cols,'credits'); |
|
} |
push(@cols,'lastlogin','clicker'); |
push(@cols,'lastlogin','clicker'); |
} |
} |
if (($context eq 'course') && ($mode ne 'autoenroll') && |
if (($context eq 'course') && ($mode ne 'autoenroll') && |
($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'})) { |
($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'})) { |
push(@cols,'photos'); |
push(@cols,'photo'); |
|
} |
|
if ($context eq 'domain') { |
|
push (@cols,('authorusage','authorquota','extent')); |
} |
} |
} |
} |
return @cols; |
return @cols; |
} |
} |
|
|
sub column_checkboxes { |
sub column_checkboxes { |
my ($context,$mode,$formname) = @_; |
my ($context,$mode,$formname,$showcredits) = @_; |
my @cols = &get_cols_array($context,$mode); |
my @cols = &get_cols_array($context,$mode,$showcredits); |
my @showncols = &Apache::loncommon::get_env_multiple('form.showcol'); |
my @showncols = &Apache::loncommon::get_env_multiple('form.showcol'); |
my (%disabledchk,%unchecked); |
my (%disabledchk,%unchecked); |
if ($env{'form.phase'} eq '') { |
if ($env{'form.phase'} eq '') { |
Line 1897 sub column_checkboxes {
|
Line 2050 sub column_checkboxes {
|
if ($context eq 'course') { |
if ($context eq 'course') { |
$disabledchk{'role'} = 1; |
$disabledchk{'role'} = 1; |
$unchecked{'photo'} = 1; |
$unchecked{'photo'} = 1; |
|
$unchecked{'clicker'} = 1; |
|
if ($showcredits) { |
|
$unchecked{'credits'} = 1; |
|
} |
|
} elsif ($context eq 'domain') { |
|
$unchecked{'extent'} = 1; |
} |
} |
$unchecked{'clicker'} = 1; |
|
$unchecked{'start'} = 1; |
$unchecked{'start'} = 1; |
$unchecked{'end'} = 1; |
$unchecked{'end'} = 1; |
} else { |
} else { |
if ($env{'form.Status'} ne 'Any') { |
if ($env{'form.Status'} ne 'Any') { |
$disabledchk{'status'} = 1; |
$disabledchk{'status'} = 1; |
} |
} |
if ($env{'form.showrole'} ne 'Any') { |
if (($env{'form.showrole'} ne 'Any') && ($env{'form.showrole'} ne 'cr')) { |
$disabledchk{'role'} = 1; |
$disabledchk{'role'} = 1; |
|
} |
|
if ($context eq 'domain') { |
|
if (($env{'form.roletype'} eq 'course') || |
|
($env{'form.roletype'} eq 'community')) { |
|
$disabledchk{'status'} = 1; |
|
$disabledchk{'authorusage'} = 1; |
|
$disabledchk{'authorquota'} = 1; |
|
} elsif ($env{'form.roletype'} eq 'domain') { |
|
$disabledchk{'extent'} = 1; |
|
} |
} |
} |
} |
} |
my $numposs = scalar(@cols); |
my $numposs = scalar(@cols); |
my $numinrow = 8; |
my $numinrow = 7; |
my %lt = &get_column_names($context); |
my %lt = &get_column_names($context); |
my $output = '<fieldset><legend>'.&mt('Information to show').'</legend>'."\n".'<span class="LC_nobreak">'. |
my $output = '<fieldset><legend>'.&mt('Information to show').'</legend>'."\n".'<span class="LC_nobreak">'. |
'<input type="button" onclick="javascript:checkAll(document.'.$formname.'.showcol);" value="'.&mt('check all').'" />'. |
'<input type="button" onclick="javascript:checkAll(document.'.$formname.'.showcol);" value="'.&mt('check all').'" />'. |
Line 1950 sub column_checkboxes {
|
Line 2118 sub column_checkboxes {
|
} else { |
} else { |
$output .= '<td>'; |
$output .= '<td>'; |
} |
} |
$output .= '<label><input id="showcol'.$cols[$i].'" type="checkbox" name="showcol" value="'.$cols[$i].'"'.$checked.' />'. |
my $style; |
$lt{$cols[$i]}.'</label></td>'; |
if ($cols[$i] eq 'extent') { |
|
if (($env{'form.roletype'} eq 'domain') || ($env{'form.roletype'} eq '')) { |
|
$style = ' style="display: none;"'; |
|
} |
|
} elsif (($cols[$i] eq 'authorusage') || ($cols[$i] eq 'authorquota')) { |
|
if ($env{'form.roletype'} ne 'domain') { |
|
$style = ' style="display: none;"'; |
|
} |
|
} |
|
$output .= '<span id="show'.$cols[$i].'"'.$style.'><label>'. |
|
'<input id="showcol'.$cols[$i].'" type="checkbox" name="showcol" value="'.$cols[$i].'"'.$checked.' /><span id="showcoltext'.$cols[$i].'">'. |
|
$lt{$cols[$i]}.'</span>'. |
|
'</label></span></td>'; |
} |
} |
$output .= '</tr></table></fieldset>'; |
$output .= '</tr></table></fieldset>'; |
return $output; |
return $output; |
Line 1976 sub get_column_names {
|
Line 2155 sub get_column_names {
|
'end' => "end date", |
'end' => "end date", |
'status' => "status", |
'status' => "status", |
'role' => "role", |
'role' => "role", |
|
'credits' => "credits", |
'type' => "enroll type/action", |
'type' => "enroll type/action", |
'email' => "e-mail address", |
'email' => "e-mail address", |
'photo' => "photo", |
'photo' => "photo", |
'lastlogin' => "last login", |
'lastlogin' => "last login", |
'extent' => "extent", |
'extent' => "extent", |
|
'authorusage' => "disk usage (%)", |
|
'authorquota' => "disk quota (MB)", |
'ca' => "check all", |
'ca' => "check all", |
'ua' => "uncheck all", |
'ua' => "uncheck all", |
'clicker' => "clicker-ID", |
'clicker' => "clicker-ID", |
); |
); |
if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { |
if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { |
$lt{'extent'} = &mt('Course(s): description, section(s), status'); |
$lt{'extent'} = &mt('course(s): description, section(s), status'); |
} elsif ($context eq 'domain' && $env{'form.roletype'} eq 'community') { |
} elsif ($context eq 'domain' && $env{'form.roletype'} eq 'community') { |
$lt{'extent'} = &mt('Communities: description, section(s), status'); |
$lt{'extent'} = &mt('community(s): description, section(s), status'); |
} elsif ($context eq 'author') { |
} elsif (($context eq 'author') || |
$lt{'extent'} = &mt('Author'); |
($context eq 'domain' && $env{'form.roletype'} eq 'author')) { |
|
$lt{'extent'} = &mt('author'); |
} |
} |
return %lt; |
return %lt; |
} |
} |
Line 2140 sub courses_selector {
|
Line 2323 sub courses_selector {
|
my $allidlist = $idlist{$codetitles[0]}; |
my $allidlist = $idlist{$codetitles[0]}; |
$jscript .= &Apache::courseclassifier::courseset_js_start($formname,$longtitles_str,$allidlist); |
$jscript .= &Apache::courseclassifier::courseset_js_start($formname,$longtitles_str,$allidlist); |
$jscript .= $scripttext; |
$jscript .= $scripttext; |
$jscript .= &Apache::courseclassifier::javascript_code_selections($formname,@codetitles); |
$jscript .= &Apache::courseclassifier::javascript_code_selections($formname,\@codetitles); |
} |
} |
} |
} |
my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($cdom); |
my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($cdom); |
Line 2169 function setCourseCat(formname) {
|
Line 2352 function setCourseCat(formname) {
|
} |
} |
courseSet('$codetitles[1]'); |
courseSet('$codetitles[1]'); |
for (var j=0; j<formname.Department.length; j++) { |
for (var j=0; j<formname.Department.length; j++) { |
if (formname.Department.options[j].value == "$env{'form.Department'}") { formname.Department.options[j].selected = true; |
if (formname.Department.options[j].value == "$env{'form.Department'}") { |
|
formname.Department.options[j].selected = true; |
} |
} |
} |
} |
if (formname.Department.options[formname.Department.selectedIndex].value == -1) { |
if (formname.Department.options[formname.Department.selectedIndex].value == -1) { |
Line 2244 sub instcode_from_coursefilter {
|
Line 2428 sub instcode_from_coursefilter {
|
return $instcode; |
return $instcode; |
} |
} |
|
|
sub display_adv_courseroles { |
|
my $output; |
|
# |
|
# List course personnel |
|
my %coursepersonnel = |
|
&Apache::lonnet::get_course_adv_roles($env{'request.course.id'}); |
|
# |
|
$output = '<br />'.&Apache::loncommon::start_data_table(); |
|
foreach my $role (sort(keys(%coursepersonnel))) { |
|
next if ($role =~ /^\s*$/); |
|
$output .= &Apache::loncommon::start_data_table_row(). |
|
'<td>'.$role.'</td><td>'; |
|
foreach my $user (split(',',$coursepersonnel{$role})) { |
|
my ($puname,$pudom)=split(':',$user); |
|
$output .= ' '.&Apache::loncommon::aboutmewrapper( |
|
&Apache::loncommon::plainname($puname,$pudom), |
|
$puname,$pudom); |
|
} |
|
$output .= '</td>'.&Apache::loncommon::end_data_table_row(); |
|
} |
|
$output .= &Apache::loncommon::end_data_table(); |
|
} |
|
|
|
sub make_keylist_array { |
sub make_keylist_array { |
my ($index,$keylist); |
my ($index,$keylist); |
$index->{'domain'} = &Apache::loncoursedata::CL_SDOM(); |
$index->{'domain'} = &Apache::loncoursedata::CL_SDOM(); |
Line 2285 sub make_keylist_array {
|
Line 2446 sub make_keylist_array {
|
$index->{'extent'} = &Apache::loncoursedata::CL_EXTENT(); |
$index->{'extent'} = &Apache::loncoursedata::CL_EXTENT(); |
$index->{'photo'} = &Apache::loncoursedata::CL_PHOTO(); |
$index->{'photo'} = &Apache::loncoursedata::CL_PHOTO(); |
$index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL(); |
$index->{'thumbnail'} = &Apache::loncoursedata::CL_THUMBNAIL(); |
|
$index->{'credits'} = &Apache::loncoursedata::CL_CREDITS(); |
|
$index->{'instsec'} = &Apache::loncoursedata::CL_INSTSEC(); |
|
$index->{'authorquota'} = &Apache::loncoursedata::CL_AUTHORQUOTA(); |
|
$index->{'authorusage'} = &Apache::loncoursedata::CL_AUTHORUSAGE(); |
foreach my $key (keys(%{$index})) { |
foreach my $key (keys(%{$index})) { |
$keylist->[$index->{$key}] = $key; |
$keylist->[$index->{$key}] = $key; |
} |
} |
Line 2333 sub process_date_info {
|
Line 2498 sub process_date_info {
|
} |
} |
|
|
sub show_users_list { |
sub show_users_list { |
my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname)=@_; |
my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist,$formname, |
|
$showcredits,$needauthorquota,$needauthorusage)=@_; |
if ($formname eq '') { |
if ($formname eq '') { |
$formname = 'studentform'; |
$formname = 'studentform'; |
} |
} |
|
my $londocroot = $Apache::lonnet::perlvar{'lonDocRoot'}; |
# |
# |
# Variables for excel output |
# Variables for excel output |
my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format); |
my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format); |
Line 2348 sub show_users_list {
|
Line 2515 sub show_users_list {
|
my @sortable = ('username','domain','id','fullname','start','end','email','role'); |
my @sortable = ('username','domain','id','fullname','start','end','email','role'); |
if ($context eq 'course') { |
if ($context eq 'course') { |
push(@sortable,('section','groups','type')); |
push(@sortable,('section','groups','type')); |
|
if ($showcredits) { |
|
push(@sortable,'credits'); |
|
} |
} else { |
} else { |
push(@sortable,'extent'); |
push(@sortable,'extent'); |
|
if (($context eq 'domain') && ($env{'form.roletype'} eq 'domain') && |
|
(($env{'form.showrole'} eq 'Any') || ($env{'form.showrole'} eq 'au'))) { |
|
push(@sortable,('authorusage','authorquota')); |
|
} |
} |
} |
if ($mode eq 'pickauthor') { |
if ($mode eq 'pickauthor') { |
@sortable = ('username','fullname','email','status'); |
@sortable = ('username','fullname','email','status'); |
} |
} |
if (!grep(/^\Q$sortby\E$/,@sortable)) { |
my %is_sortable; |
|
map { $is_sortable{$_} = 1; } @sortable; |
|
unless ($is_sortable{$sortby}) { |
$sortby = 'username'; |
$sortby = 'username'; |
} |
} |
my $setting = $env{'form.roletype'}; |
my $setting = $env{'form.roletype'}; |
my ($cid,$cdom,$cnum,$classgroups,$crstype); |
my ($cid,$cdom,$cnum,$classgroups,$crstype,$defaultcredits); |
if ($context eq 'course') { |
if ($context eq 'course') { |
$cid = $env{'request.course.id'}; |
$cid = $env{'request.course.id'}; |
$crstype = &Apache::loncommon::course_type(); |
$crstype = &Apache::loncommon::course_type(); |
($cnum,$cdom) = &get_course_identity($cid); |
($cnum,$cdom) = &get_course_identity($cid); |
|
$defaultcredits = $env{'course.'.$cid.'.internal.defaultcredits'}; |
($classgroups) = &Apache::loncoursedata::get_group_memberships( |
($classgroups) = &Apache::loncoursedata::get_group_memberships( |
$userlist,$keylist,$cdom,$cnum); |
$userlist,$keylist,$cdom,$cnum); |
if ($mode eq 'autoenroll') { |
if ($mode eq 'autoenroll') { |
Line 2403 $verify_action_js
|
Line 2580 $verify_action_js
|
|
|
function username_display_launch(username,domain) { |
function username_display_launch(username,domain) { |
var target; |
var target; |
for (var i=0; i<document.$formname.usernamelink.length; i++) { |
if (!document.$formname.usernamelink.length) { |
if (document.$formname.usernamelink[i].checked) { |
target = document.$formname.usernamelink.value; |
target = document.$formname.usernamelink[i].value; |
} else { |
|
for (var i=0; i<document.$formname.usernamelink.length; i++) { |
|
if (document.$formname.usernamelink[i].checked) { |
|
target = document.$formname.usernamelink[i].value; |
|
} |
} |
} |
} |
} |
if (target == 'modify') { |
if ((target == 'modify') || (target == 'activity')) { |
|
var nextaction = 'singleuser'; |
|
if (target == 'activity') { |
|
nextaction = 'accesslogs'; |
|
} |
if (document.$formname.userwin.checked == true) { |
if (document.$formname.userwin.checked == true) { |
var url = '/adm/createuser?srchterm='+username+'&srchdomain='+domain+'&phase=get_user_info&action=singleuser&srchin=dom&srchby=uname&srchtype=exact&popup=1'; |
var url = '/adm/createuser?srchterm='+username+'&srchdomain='+domain+'&phase=get_user_info&srchin=dom&srchby=uname&srchtype=exact&popup=1&action='+nextaction; |
var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no'; |
var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no'; |
modifywin = window.open(url,'',options,1); |
modifywin = window.open(url,'',options,1); |
modifywin.focus(); |
modifywin.focus(); |
Line 2419 function username_display_launch(usernam
|
Line 2604 function username_display_launch(usernam
|
document.$formname.srchterm.value=username; |
document.$formname.srchterm.value=username; |
document.$formname.srchdomain.value=domain; |
document.$formname.srchdomain.value=domain; |
document.$formname.phase.value='get_user_info'; |
document.$formname.phase.value='get_user_info'; |
document.$formname.action.value = 'singleuser'; |
document.$formname.action.value = nextaction; |
document.$formname.submit(); |
document.$formname.submit(); |
} |
} |
} |
} |
Line 2455 END
|
Line 2640 END
|
$r->print(<<END); |
$r->print(<<END); |
<input type="hidden" name="sortby" value="$sortby" /> |
<input type="hidden" name="sortby" value="$sortby" /> |
END |
END |
my @cols = &infocolumns($context,$mode); |
my @cols = &infocolumns($context,$mode,$showcredits); |
my %coltxt = &get_column_names($context); |
my %coltxt = &get_column_names($context); |
my %acttxt = &Apache::lonlocal::texthash( |
my %acttxt = &Apache::lonlocal::texthash( |
'pr' => "Proceed", |
'pr' => "Proceed", |
Line 2465 END
|
Line 2650 END
|
'owin' => "Open in a new window", |
'owin' => "Open in a new window", |
'modify' => "Modify a user's information", |
'modify' => "Modify a user's information", |
'track' => "View a user's recent activity", |
'track' => "View a user's recent activity", |
|
'activity' => "View a user's access log", |
); |
); |
my %lt = (%coltxt,%acttxt); |
my %lt = (%coltxt,%acttxt); |
my $rolefilter = $env{'form.showrole'}; |
my $rolefilter = $env{'form.showrole'}; |
Line 2539 END
|
Line 2725 END
|
if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { |
if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { |
$canchangesec{$role} = $env{'request.course.sec'}; |
$canchangesec{$role} = $env{'request.course.sec'}; |
} |
} |
|
} elsif ((($role eq 'co') && ($crstype eq 'Community')) || |
|
(($role eq 'cc') && ($crstype eq 'Course'))) { |
|
if (&is_courseowner($env{'request.course.id'}, |
|
$env{'course.'.$env{'request.course.id'}.'.internal.courseowner'})) { |
|
$canchange{$role} = 1; |
|
} |
} |
} |
} |
} |
} |
} |
Line 2549 END
|
Line 2741 END
|
if ($permission->{'cusr'}) { |
if ($permission->{'cusr'}) { |
unshift (@linkdests,'modify'); |
unshift (@linkdests,'modify'); |
} |
} |
if (&Apache::lonnet::allowed('vsa', $env{'request.course.id'}) || |
if ($context eq 'course') { |
&Apache::lonnet::allowed('vsa', $env{'request.course.id'}.'/'. |
if (&Apache::lonnet::allowed('vsa', $env{'request.course.id'}) || |
$env{'request.course.sec'})) { |
&Apache::lonnet::allowed('vsa', $env{'request.course.id'}.'/'. |
push(@linkdests,'track'); |
$env{'request.course.sec'})) { |
|
push(@linkdests,'track'); |
|
} |
|
} elsif ($context eq 'domain') { |
|
if (&Apache::lonnet::allowed('vac',$env{'request.role.domain'})) { |
|
push(@linkdests,'activity'); |
|
} |
} |
} |
|
|
$output .= '<td>'; |
$output .= '<td>'; |
my $usernamelink = $env{'form.usernamelink'}; |
my $usernamelink = $env{'form.usernamelink'}; |
if ($usernamelink eq '') { |
if ($usernamelink eq '') { |
Line 2571 END
|
Line 2768 END
|
if ($env{'form.userwin'}) { |
if ($env{'form.userwin'}) { |
$checkwin = ' checked="checked"'; |
$checkwin = ' checked="checked"'; |
} |
} |
$output .= '</td><td valign="top" style="border-left: 1px solid;"><span class="LC_nobreak"><input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'}.'</span></td></tr></table></fieldset></div>'; |
$output .= |
|
'</td><td valign="top" style="border-left: 1px solid;">' |
|
.'<span class="LC_nobreak"><label>' |
|
.'<input type="checkbox" name="userwin" value="1"'.$checkwin.' />'.$lt{'owin'} |
|
.'</label></span></td></tr></table></fieldset></div>'; |
} |
} |
$output .= "\n".'<br clear="all" />'."\n". |
$output .= "\n".'<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n". |
&Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table(). |
&Apache::loncommon::start_data_table_header_row(); |
&Apache::loncommon::start_data_table_header_row(); |
if ($mode eq 'autoenroll') { |
if ($mode eq 'autoenroll') { |
Line 2583 END
|
Line 2784 END
|
} else { |
} else { |
$output .= "\n".'<th> </th>'."\n"; |
$output .= "\n".'<th> </th>'."\n"; |
if ($actionselect) { |
if ($actionselect) { |
$output .= '<th>'.&mt('Select').'</th>'."\n"; |
$output .= '<th class="LC_nobreak" valign="top">'.&mt('Select').'</th>'."\n"; |
} |
} |
} |
} |
foreach my $item (@cols) { |
foreach my $item (@cols) { |
$output .= "<th><a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\">$lt{$item}</a></th>\n"; |
$output .= '<th class="LC_nobreak" valign="top">'; |
|
if ($is_sortable{$item}) { |
|
$output .= "<a href=\"javascript:document.$formname.sortby.value='$item';document.$formname.submit();\" style=\"text-decoration:none;\">$lt{$item}<span class=\"LC_fontsize_small\"> ▼</span></a>"; |
|
} else { |
|
$output .= $lt{$item}; |
|
} |
|
$output .= "</th>\n"; |
} |
} |
my %role_types = &role_type_names(); |
my %role_types = &role_type_names(); |
$output .= &Apache::loncommon::end_data_table_header_row(); |
$output .= &Apache::loncommon::end_data_table_header_row(); |
Line 2747 END
|
Line 2954 END
|
'gif','thumbnail'); |
'gif','thumbnail'); |
} |
} |
} |
} |
|
if (($role eq 'st') && ($defaultcredits)) { |
|
if ($userlist->{$user}->[$index{'credits'}] eq '') { |
|
$userlist->{$user}->[$index{'credits'}] = $defaultcredits; |
|
} |
|
} |
} |
} |
} |
} |
my %emails = &Apache::loncommon::getemails($uname,$udom); |
my %emails = &Apache::loncommon::getemails($uname,$udom); |
if ($emails{'permanentemail'} =~ /\S/) { |
if ($emails{'permanentemail'} =~ /\S/) { |
$userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'}; |
$userlist->{$user}->[$index{'email'}] = $emails{'permanentemail'}; |
} |
} |
|
if (($context eq 'domain') && ($env{'form.roletype'} eq 'domain') && |
|
($role eq 'au')) { |
|
my ($disk_quota,$current_disk_usage,$percent); |
|
if (($needauthorusage) || ($needauthorquota)) { |
|
$disk_quota = &Apache::loncommon::get_user_quota($uname,$udom,'author'); |
|
} |
|
if ($needauthorusage) { |
|
$current_disk_usage = |
|
&Apache::lonnet::diskusage($udom,$uname,"$londocroot/priv/$udom/$uname"); |
|
if ($disk_quota == 0) { |
|
$percent = 100.0; |
|
} else { |
|
$percent = $current_disk_usage/(10 * $disk_quota); |
|
} |
|
$userlist->{$user}->[$index{'authorusage'}] = sprintf("%.0f",$percent); |
|
} |
|
if ($needauthorquota) { |
|
$userlist->{$user}->[$index{'authorquota'}] = sprintf("%.2f",$disk_quota); |
|
} |
|
} |
$usercount ++; |
$usercount ++; |
} |
} |
my $autocount = 0; |
my $autocount = 0; |
Line 2773 END
|
Line 3005 END
|
my $index = $index{$sortby}; |
my $index = $index{$sortby}; |
my $second = $index{'username'}; |
my $second = $index{'username'}; |
my $third = $index{'domain'}; |
my $third = $index{'domain'}; |
my @sorted_users = sort { |
my @sorted_users; |
lc($userlist->{$a}->[$index]) cmp lc($userlist->{$b}->[$index]) |
if (($sortby eq 'authorquota') || ($sortby eq 'authorusage')) { |
|| |
@sorted_users = sort { |
lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) || |
$userlist->{$b}->[$index] <=> $userlist->{$a}->[$index] || |
lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third]) |
lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) || |
} (keys(%$userlist)); |
lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third]) |
|
} (keys(%$userlist)); |
|
} else { |
|
@sorted_users = sort { |
|
lc($userlist->{$a}->[$index]) cmp lc($userlist->{$b}->[$index]) || |
|
lc($userlist->{$a}->[$second]) cmp lc($userlist->{$b}->[$second]) || |
|
lc($userlist->{$a}->[$third]) cmp lc($userlist->{$b}->[$third]) |
|
} (keys(%$userlist)); |
|
} |
my $rowcount = 0; |
my $rowcount = 0; |
|
my $disabled; |
|
if ($mode eq 'autoenroll') { |
|
unless ($permission->{'cusr'}) { |
|
$disabled = ' disabled="disabled"'; |
|
} |
|
} |
foreach my $user (@sorted_users) { |
foreach my $user (@sorted_users) { |
my %in; |
my %in; |
my $sdata = $userlist->{$user}; |
my $sdata = $userlist->{$user}; |
Line 2789 END
|
Line 3035 END
|
} |
} |
my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1]; |
my $clickers = (&Apache::lonnet::userenvironment($in{'domain'},$in{'username'},'clickers'))[1]; |
if ($clickers!~/\w/) { $clickers='-'; } |
if ($clickers!~/\w/) { $clickers='-'; } |
$in{'clicker'} = $clickers; |
$in{'clicker'} = $clickers; |
my $role = $in{'role'}; |
my $role = $in{'role'}; |
$in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype); |
$in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype); |
unless ($mode eq 'excel') { |
unless ($mode eq 'excel') { |
Line 2816 END
|
Line 3062 END
|
if ($mode eq 'autoenroll') { |
if ($mode eq 'autoenroll') { |
my $cellentry; |
my $cellentry; |
if ($in{'type'} eq 'auto') { |
if ($in{'type'} eq 'auto') { |
$cellentry = '<b>'.&mt('auto').'</b> <label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'" /> Change</label>'; |
$cellentry = '<b>'.&mt('auto').'</b> <label><input type="checkbox" name="chgauto" value="'.$in{'username'}.':'.$in{'domain'}.'"'.$disabled.' /> '.&mt('Change').'</label>'; |
$autocount ++; |
$autocount ++; |
} else { |
} else { |
$cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><span class="LC_nobreak"><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'" /> Change</label></span></td></tr><tr><td><span class="LC_nobreak">'; |
$cellentry = '<table border="0" cellspacing="0"><tr><td rowspan="2"><b>'.&mt('manual').'</b></td><td><span class="LC_nobreak"><label><input type="checkbox" name="chgmanual" value="'.$in{'username'}.':'.$in{'domain'}.'"'.$disabled.' /> '.&mt('Change').'</label></span></td></tr><tr><td><span class="LC_nobreak">'; |
$manualcount ++; |
$manualcount ++; |
if ($in{'lockedtype'}) { |
if ($in{'lockedtype'}) { |
$cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" /> '.&mt('Unlock').'</label>'; |
$cellentry .= '<label><input type="checkbox" name="unlockchg" value="'.$in{'username'}.':'.$in{'domain'}.'"'.$disabled.' /> '.&mt('Unlock').'</label>'; |
$unlockcount ++; |
$unlockcount ++; |
} else { |
} else { |
$cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$in{'username'}.':'.$in{'domain'}.'" /> '.&mt('Lock').'</label>'; |
$cellentry .= '<label><input type="checkbox" name="lockchg" value="'.$in{'username'}.':'.$in{'domain'}.'"'.$disabled.' /> '.&mt('Lock').'</label>'; |
$lockcount ++; |
$lockcount ++; |
} |
} |
$cellentry .= '</span></td></tr></table>'; |
$cellentry .= '</span></td></tr></table>'; |
Line 2854 END
|
Line 3100 END
|
if ($showcheckbox) { |
if ($showcheckbox) { |
$checkval = $user; |
$checkval = $user; |
if ($context eq 'course') { |
if ($context eq 'course') { |
if ($role eq 'st') { |
if (($role eq 'co' || $role eq 'cc') && |
$checkval .= ':st'; |
($user =~ /^\Q$env{'user.name'}:$env{'user.domain'}:$role\E/)) { |
} |
$showcheckbox = 0; |
$checkval .= ':'.$in{'section'}; |
} else { |
if ($role eq 'st') { |
if ($role eq 'st') { |
$checkval .= ':'.$in{'type'}.':'. |
$checkval .= ':st'; |
$in{'lockedtype'}; |
} |
|
$checkval .= ':'.$in{'section'}; |
|
if ($role eq 'st') { |
|
$checkval .= ':'.$in{'type'}.':'. |
|
$in{'lockedtype'}.':'. |
|
$in{'credits'}.':'. |
|
&escape($in{'instsec'}); |
|
} |
|
} |
|
} |
|
if ($showcheckbox) { |
|
$r->print('<td><input type="checkbox" name="'. |
|
'actionlist" value="'. |
|
&HTML::Entities::encode($checkval,'&<>"').'" />'); |
|
foreach my $item ('start','end') { |
|
$r->print('<input type="hidden" name="'. |
|
&HTML::Entities::encode($checkval.'_'.$item,'&<>"').'"'. |
|
' value="'.$sdata->[$index{$item}].'" />'); |
} |
} |
|
$r->print('</td>'); |
|
} else { |
|
$r->print('<td> </td>'); |
} |
} |
$r->print('<td><input type="checkbox" name="'. |
|
'actionlist" value="'.$checkval.'" /></td>'); |
|
} else { |
} else { |
$r->print('<td> </td>'); |
$r->print('<td> </td>'); |
} |
} |
Line 2875 END
|
Line 3139 END
|
foreach my $item (@cols) { |
foreach my $item (@cols) { |
if ($item eq 'username') { |
if ($item eq 'username') { |
$r->print('<td>'.&print_username_link($mode,\%in).'</td>'); |
$r->print('<td>'.&print_username_link($mode,\%in).'</td>'); |
} elsif (($item eq 'start' || $item eq 'end') && ($actionselect)) { |
|
$r->print('<td>'.$in{$item}.'<input type="hidden" name="'.$checkval.'_'.$item.'" value="'.$sdata->[$index{$item}].'" /></td>'."\n"); |
|
} elsif ($item eq 'status') { |
} elsif ($item eq 'status') { |
my $showitem = $in{$item}; |
my $showitem = $in{$item}; |
if (defined($ltstatus{$in{$item}})) { |
if (defined($ltstatus{$in{$item}})) { |
Line 2902 END
|
Line 3164 END
|
} else { |
} else { |
$r->print('<td> </td>'."\n"); |
$r->print('<td> </td>'."\n"); |
} |
} |
} |
} |
|
} elsif (($item eq 'authorquota') || ($item eq 'authorusage')) { |
|
$r->print('<td align="right">'.$in{$item}.'</td>'."\n"); |
} else { |
} else { |
$r->print('<td>'.$in{$item}.'</td>'."\n"); |
$r->print('<td>'.$in{$item}.'</td>'."\n"); |
} |
} |
Line 2938 END
|
Line 3202 END
|
$r->print(&Apache::loncommon::end_data_table().'<br />'); |
$r->print(&Apache::loncommon::end_data_table().'<br />'); |
} elsif ($mode eq 'excel') { |
} elsif ($mode eq 'excel') { |
$excel_workbook->close(); |
$excel_workbook->close(); |
$r->print(&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '<p><a href="'.$excel_filename.'">','</a>')."</p>\n"); |
$r->print('<p>'.&mt('[_1]Your Excel spreadsheet[_2] is ready for download.', '<a href="'.$excel_filename.'">','</a>')."</p>\n"); |
} elsif ($mode eq 'csv') { |
} elsif ($mode eq 'csv') { |
close($CSVfile); |
close($CSVfile); |
$r->print(&mt('[_1]Your CSV file[_2] is ready for download.', '<p><a href="'.$CSVfilename.'">','</a>')."</p>\n"); |
$r->print('<p>'.&mt('[_1]Your CSV file[_2] is ready for download.', '<a href="'.$CSVfilename.'">','</a>')."</p>\n"); |
$r->rflush(); |
$r->rflush(); |
} |
} |
if ($mode eq 'autoenroll') { |
if ($mode eq 'autoenroll') { |
Line 2973 sub bulkaction_javascript {
|
Line 3237 sub bulkaction_javascript {
|
my $noaction = &mt("You need to select an action to take for the user(s) you have selected"); |
my $noaction = &mt("You need to select an action to take for the user(s) you have selected"); |
my $singconfirm = &mt(' for a single user?'); |
my $singconfirm = &mt(' for a single user?'); |
my $multconfirm = &mt(' for multiple users?'); |
my $multconfirm = &mt(' for multiple users?'); |
|
&js_escape(\$alert); |
|
&js_escape(\$noaction); |
|
&js_escape(\$singconfirm); |
|
&js_escape(\$multconfirm); |
my $output = <<"ENDJS"; |
my $output = <<"ENDJS"; |
function verify_action (field) { |
function verify_action (field) { |
var numchecked = 0; |
var numchecked = 0; |
Line 3103 sub select_actions {
|
Line 3371 sub select_actions {
|
chgdates => "Change starting/ending dates", |
chgdates => "Change starting/ending dates", |
chgsec => "Change section associated with user roles", |
chgsec => "Change section associated with user roles", |
); |
); |
|
# FIXME Add an option to change credits for student roles. |
my ($output,$options,%choices); |
my ($output,$options,%choices); |
# FIXME Disable actions for now for roletype=course in domain context |
# FIXME Disable actions for now for roletype=course in domain context |
if ($context eq 'domain' && $setting eq 'course') { |
if ($context eq 'domain' && $setting eq 'course') { |
Line 3110 sub select_actions {
|
Line 3379 sub select_actions {
|
} |
} |
if ($context eq 'course') { |
if ($context eq 'course') { |
if ($env{'form.showrole'} ne 'Any') { |
if ($env{'form.showrole'} ne 'Any') { |
if (!&Apache::lonnet::allowed('c'.$env{'form.showrole'}, |
my $showactions; |
$env{'request.course.id'})) { |
if (&Apache::lonnet::allowed('c'.$env{'form.showrole'}, |
if ($env{'request.course.sec'} eq '') { |
$env{'request.course.id'})) { |
return; |
$showactions = 1; |
} else { |
} elsif ($env{'request.course.sec'} ne '') { |
if (!&Apache::lonnet::allowed('c'.$env{'form.showrole'},$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { |
if (&Apache::lonnet::allowed('c'.$env{'form.showrole'},$env{'request.course.id'}.'/'.$env{'request.course.sec'})) { |
return; |
$showactions = 1; |
} |
} |
} |
} |
|
unless ($showactions) { |
|
unless (&is_courseowner($env{'request.course.id'}, |
|
$env{'course.'.$env{'request.course.id'}.'.internal.courseowner'})) { |
|
return; |
|
} |
} |
} |
} |
} |
} |
} |
Line 3225 ENDTWO
|
Line 3499 ENDTWO
|
} |
} |
|
|
sub date_section_selector { |
sub date_section_selector { |
my ($context,$permission,$crstype) = @_; |
my ($context,$permission,$crstype,$showcredits) = @_; |
my $callingform = $env{'form.callingform'}; |
my $callingform = $env{'form.callingform'}; |
my $formname = 'dateselect'; |
my $formname = 'dateselect'; |
my $groupslist = &get_groupslist(); |
my $groupslist = &get_groupslist(); |
my $sec_js = &setsections_javascript($formname,$groupslist); |
my $sec_js = |
|
&setsections_javascript($formname,$groupslist,undef,undef,$crstype, |
|
$showcredits); |
my $output = <<"END"; |
my $output = <<"END"; |
<script type="text/javascript"> |
<script type="text/javascript"> |
// <![CDATA[ |
// <![CDATA[ |
Line 3361 ENDJS
|
Line 3637 ENDJS
|
$info = '<input type="hidden" name="retainsec" value="0" />'; |
$info = '<input type="hidden" name="retainsec" value="0" />'; |
} |
} |
my $rowtitle = &mt('New section to assign'); |
my $rowtitle = &mt('New section to assign'); |
my $secbox = §ion_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context,'',$crstype); |
my $secbox = §ion_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle, |
|
$permission,$context,'chgsec',$crstype); |
$output .= $info.$secbox; |
$output .= $info.$secbox; |
} |
} |
$output .= '<p>'. |
$output .= '<p>'. |
Line 3371 ENDJS
|
Line 3648 ENDJS
|
} |
} |
|
|
sub section_picker { |
sub section_picker { |
my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype) = @_; |
my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype, |
|
$showcredits,$credits) = @_; |
my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); |
my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); |
my $sections_select .= &course_sections(\%sections_count,$role); |
my $sections_select .= &course_sections(\%sections_count,$role); |
my $secbox = '<div>'.&Apache::lonhtmlcommon::start_pick_box()."\n"; |
my $secbox = '<div>'.&Apache::lonhtmlcommon::start_pick_box()."\n"; |
if ($mode eq 'upload') { |
if ($mode eq 'upload') { |
my ($options,$cb_script,$coursepick) = |
my ($options,$cb_script,$coursepick) = |
&default_role_selector($context,1,$crstype); |
&default_role_selector($context,1,$crstype,$showcredits); |
$secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value'). |
$secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value'). |
$options. &Apache::lonhtmlcommon::row_closure(1)."\n"; |
$options. &Apache::lonhtmlcommon::row_closure(1)."\n"; |
} |
} |
Line 3391 sub section_picker {
|
Line 3669 sub section_picker {
|
'<input type="hidden" name="sections" value="" />'."\n". |
'<input type="hidden" name="sections" value="" />'."\n". |
'</td></tr></table>'."\n"; |
'</td></tr></table>'."\n"; |
} else { |
} else { |
$secbox .= '<input type="hidden" name="sections" value="'. |
$secbox .= '<input type="hidden" name="sections" value="'. |
$env{'request.course.sec'}.'" />'. |
$env{'request.course.sec'}.'" />'. |
$env{'request.course.sec'}; |
$env{'request.course.sec'}; |
} |
} |
$secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n". |
$secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n"; |
&Apache::lonhtmlcommon::end_pick_box().'</div>'; |
unless ($mode eq 'chgsec') { |
|
if ($showcredits) { |
|
$secbox .= |
|
&Apache::lonhtmlcommon::row_title(&mt('credits (students)'), |
|
'LC_evenrow_value')."\n". |
|
'<input type="text" name="credits" size="3" value="'.$credits.'" />'."\n". |
|
&Apache::lonhtmlcommon::row_closure(1)."\n"; |
|
} |
|
} |
|
$secbox .= &Apache::lonhtmlcommon::end_pick_box().'</div>'; |
return $secbox; |
return $secbox; |
} |
} |
|
|
Line 3620 sub show_drop_list {
|
Line 3907 sub show_drop_list {
|
$check_uncheck_js |
$check_uncheck_js |
// ]]> |
// ]]> |
</script> |
</script> |
<p> |
|
<input type="hidden" name="phase" value="four" /> |
<input type="hidden" name="phase" value="four" /> |
END |
END |
my ($indexhash,$keylist) = &make_keylist_array(); |
my ($indexhash,$keylist) = &make_keylist_array(); |
Line 3644 END
|
Line 3930 END
|
} |
} |
} |
} |
if (!$studentcount) { |
if (!$studentcount) { |
|
my $msg = ''; |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
$r->print(&mt('There are no members to drop.')); |
$msg = &mt('There are no members to drop.'); |
} else { |
} else { |
$r->print(&mt('There are no students to drop.')); |
$msg = &mt('There are no students to drop.'); |
} |
} |
|
$r->print('<p class="LC_info">'.$msg.'</p>'); |
return; |
return; |
} |
} |
my ($classgroups) = &Apache::loncoursedata::get_group_memberships( |
my ($classgroups) = &Apache::loncoursedata::get_group_memberships( |
$classlist,$keylist,$cdom,$cnum); |
$classlist,$keylist,$cdom,$cnum); |
my %lt=&Apache::lonlocal::texthash('usrn' => "username", |
my %lt=&Apache::lonlocal::texthash('usrn' => "username", |
'dom' => "domain", |
'dom' => "domain", |
|
'id' => "ID", |
'sn' => "student name", |
'sn' => "student name", |
'mn' => "member name", |
'mn' => "member name", |
'sec' => "section", |
'sec' => "section", |
Line 3673 END
|
Line 3962 END
|
<th> </th> |
<th> </th> |
<th>$lt{'usrn'}</th> |
<th>$lt{'usrn'}</th> |
<th>$lt{'dom'}</th> |
<th>$lt{'dom'}</th> |
<th>ID</th> |
<th>$lt{'id'}</th> |
<th>$nametitle</th> |
<th>$nametitle</th> |
<th>$lt{'sec'}</th> |
<th>$lt{'sec'}</th> |
<th>$lt{'start'}</th> |
<th>$lt{'start'}</th> |
Line 3687 END
|
Line 3976 END
|
$r->print(<<END); |
$r->print(<<END); |
<th> </th> |
<th> </th> |
<th> |
<th> |
<a href="/adm/createuser?action=$action&sortby=username">$lt{'usrn'}</a> |
<a href="/adm/createuser?action=$action&sortby=username">$lt{'usrn'}</a> |
</th><th> |
</th><th> |
<a href="/adm/createuser?action=$action&sortby=domain">$lt{'dom'}</a> |
<a href="/adm/createuser?action=$action&sortby=domain">$lt{'dom'}</a> |
</th><th> |
</th><th> |
<a href="/adm/createuser?action=$action&sortby=id">ID</a> |
<a href="/adm/createuser?action=$action&sortby=id">$lt{'id'}</a> |
</th><th> |
</th><th> |
<a href="/adm/createuser?action=$action&sortby=fullname">$nametitle</a> |
<a href="/adm/createuser?action=$action&sortby=fullname">$nametitle</a> |
</th><th> |
</th><th> |
<a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a> |
<a href="/adm/createuser?action=$action&sortby=section">$lt{'sec'}</a> |
</th><th> |
</th><th> |
<a href="/adm/createuser?action=$action&sortby=start">$lt{'start'}</a> |
<a href="/adm/createuser?action=$action&sortby=start">$lt{'start'}</a> |
</th><th> |
</th><th> |
<a href="/adm/createuser?action=$action&sortby=end">$lt{'end'}</a> |
<a href="/adm/createuser?action=$action&sortby=end">$lt{'end'}</a> |
</th><th> |
</th><th> |
<a href="/adm/createuser?action=$action&sortby=groups">$lt{'groups'}</a> |
<a href="/adm/createuser?action=$action&sortby=groups">$lt{'groups'}</a> |
</th> |
</th> |
END |
END |
$r->print(&Apache::loncommon::end_data_table_header_row()); |
$r->print(&Apache::loncommon::end_data_table_header_row()); |
Line 3772 END
|
Line 4061 END
|
$btn = $lt{'dm'}; |
$btn = $lt{'dm'}; |
} |
} |
$r->print(<<"END"); |
$r->print(<<"END"); |
</p> |
|
<p> |
<p> |
<input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)" /> |
<input type="button" value="$lt{'ca'}" onclick="javascript:checkAll(document.studentform.droplist)" /> |
<input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" /> |
<input type="button" value="$lt{'ua'}" onclick="javascript:uncheckAll(document.studentform.droplist)" /> |
Line 3794 sub print_first_users_upload_form {
|
Line 4082 sub print_first_users_upload_form {
|
$str .= '<input type="hidden" name="action" value="upload" />'; |
$str .= '<input type="hidden" name="action" value="upload" />'; |
$str .= '<input type="hidden" name="state" value="got_file" />'; |
$str .= '<input type="hidden" name="state" value="got_file" />'; |
|
|
|
$str .= &Apache::grades::checkforfile_js(); |
|
|
$str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n"; |
$str .= '<h2>'.&mt('Upload a file containing information about users').'</h2>'."\n"; |
|
|
# Excel and CSV Help |
# Excel and CSV Help |
$str .= '<div class="LC_left_float">' |
$str .= '<div class="LC_columnSection">' |
.&Apache::loncommon::help_open_topic("Course_Create_Class_List", |
.&Apache::loncommon::help_open_topic("Course_Create_Class_List", |
&mt("How do I create a users list from a spreadsheet")) |
&mt("How do I create a users list from a spreadsheet")) |
.'</div><div class="LC_left_float">'."\n" |
.' '.&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", |
.&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", |
|
&mt("How do I create a CSV file from a spreadsheet")) |
&mt("How do I create a CSV file from a spreadsheet")) |
.'</div><br clear="all" />'."\n"; |
."</div>\n"; |
$str .= &Apache::lonhtmlcommon::start_pick_box() |
$str .= &Apache::lonhtmlcommon::start_pick_box() |
.&Apache::lonhtmlcommon::row_title(&mt('File')); |
.&Apache::lonhtmlcommon::row_title(&mt('File')); |
if (&Apache::lonlocal::current_language() ne 'en') { |
if (&Apache::lonlocal::current_language() ne 'en') { |
Line 3824 sub print_first_users_upload_form {
|
Line 4113 sub print_first_users_upload_form {
|
.&Apache::lonhtmlcommon::end_pick_box(); |
.&Apache::lonhtmlcommon::end_pick_box(); |
|
|
$str .= '<p>' |
$str .= '<p>' |
.'<input type="submit" name="fileupload" value="'.&mt('Next').'" />' |
.'<input type="submit" name="fileupload" value="'.&mt('Next').'"' |
|
.' onclick="javascript:checkUpload(this.form);" />' |
.'</p>'; |
.'</p>'; |
|
|
$r->print($str); |
$r->print($str); |
Line 3833 sub print_first_users_upload_form {
|
Line 4123 sub print_first_users_upload_form {
|
|
|
# ================================================= Drop/Add from uploaded file |
# ================================================= Drop/Add from uploaded file |
sub upfile_drop_add { |
sub upfile_drop_add { |
my ($r,$context,$permission) = @_; |
my ($r,$context,$permission,$showcredits) = @_; |
&Apache::loncommon::load_tmp_file($r); |
my $datatoken = &Apache::loncommon::valid_datatoken($env{'form.datatoken'}); |
|
if ($datatoken ne '') { |
|
&Apache::loncommon::load_tmp_file($r,$datatoken); |
|
} |
my @userdata=&Apache::loncommon::upfile_record_sep(); |
my @userdata=&Apache::loncommon::upfile_record_sep(); |
if($env{'form.noFirstLine'}){shift(@userdata);} |
if($env{'form.noFirstLine'}){shift(@userdata);} |
my @keyfields = split(/\,/,$env{'form.keyfields'}); |
my @keyfields = split(/\,/,$env{'form.keyfields'}); |
Line 3848 sub upfile_drop_add {
|
Line 4141 sub upfile_drop_add {
|
$fields{$env{'form.f'.$i}}=$keyfields[$i]; |
$fields{$env{'form.f'.$i}}=$keyfields[$i]; |
} |
} |
} |
} |
if ($env{'form.fullup'} ne 'yes') { |
|
$r->print('<form name="studentform" method="post" action="/adm/createuser">'."\n". |
|
'<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'); |
|
} |
|
# |
# |
# Store the field choices away |
# Store the field choices away |
foreach my $field (qw/username names |
my @storefields = qw/username names fname mname lname gen id |
fname mname lname gen id sec ipwd email role domain/) { |
sec ipwd email role domain inststatus/; |
|
if ($showcredits) { |
|
push (@storefields,'credits'); |
|
} |
|
my %fieldstype; |
|
foreach my $field (@storefields) { |
$env{'form.'.$field.'_choice'}=$fields{$field}; |
$env{'form.'.$field.'_choice'}=$fields{$field}; |
|
$fieldstype{$field.'_choice'} = 'scalar'; |
} |
} |
&Apache::loncommon::store_course_settings('enrollment_upload', |
&Apache::loncommon::store_course_settings('enrollment_upload',\%fieldstype); |
{ 'username_choice' => 'scalar', |
my ($cid,$crstype,$setting,$crsdom); |
'names_choice' => 'scalar', |
|
'fname_choice' => 'scalar', |
|
'mname_choice' => 'scalar', |
|
'lname_choice' => 'scalar', |
|
'gen_choice' => 'scalar', |
|
'id_choice' => 'scalar', |
|
'sec_choice' => 'scalar', |
|
'ipwd_choice' => 'scalar', |
|
'email_choice' => 'scalar', |
|
'role_choice' => 'scalar', |
|
'domain_choice' => 'scalar', |
|
'inststatus_choice' => 'scalar'}); |
|
# |
|
my ($cid,$crstype,$setting); |
|
if ($context eq 'domain') { |
if ($context eq 'domain') { |
$setting = $env{'form.roleaction'}; |
$setting = $env{'form.roleaction'}; |
} |
} |
if ($env{'request.course.id'} ne '') { |
if ($env{'request.course.id'} ne '') { |
$cid = $env{'request.course.id'}; |
$cid = $env{'request.course.id'}; |
$crstype = &Apache::loncommon::course_type(); |
$crstype = &Apache::loncommon::course_type(); |
|
$crsdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
} elsif ($setting eq 'course') { |
} elsif ($setting eq 'course') { |
if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) { |
if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) { |
$cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'}; |
$cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'}; |
$crstype = &Apache::loncommon::course_type($cid); |
$crstype = &Apache::loncommon::course_type($cid); |
|
$crsdom = $env{'form.dcdomain'}; |
} |
} |
} |
} |
my ($startdate,$enddate) = &get_dates_from_form(); |
my ($startdate,$enddate) = &get_dates_from_form(); |
Line 3894 sub upfile_drop_add {
|
Line 4177 sub upfile_drop_add {
|
my $defdom=$env{'request.role.domain'}; |
my $defdom=$env{'request.role.domain'}; |
my $domain; |
my $domain; |
if ($env{'form.defaultdomain'} ne '') { |
if ($env{'form.defaultdomain'} ne '') { |
$domain = $env{'form.defaultdomain'}; |
if (($context eq 'course') || ($setting eq 'course')) { |
|
if ($env{'form.defaultdomain'} eq $crsdom) { |
|
$domain = $env{'form.defaultdomain'}; |
|
} else { |
|
if (&Apache::lonnet::will_trust('enroll',$crsdom,$env{'form.defaultdomain'})) { |
|
$domain = $env{'form.defaultdomain'}; |
|
} else { |
|
$r->print('<span class="LC_error">'.&mt('Error').': '. |
|
&mt('Enrollment of users not permitted for specified default domain: [_1].', |
|
&Apache::lonnet::domain($env{'form.defaultdomain'},'description')).'</span>'); |
|
return 'untrusted'; |
|
} |
|
} |
|
} elsif ($context eq 'author') { |
|
if ($env{'form.defaultdomain'} eq $defdom) { |
|
$domain = $env{'form.defaultdomain'}; |
|
} else { |
|
if ((&Apache::lonnet::will_trust('othcoau',$defdom,$env{'form.defaultdomain'})) && |
|
(&Apache::lonnet::will_trust('coaurem',$env{'form.defaultdomain'},$defdom))) { |
|
$domain = $env{'form.defaultdomain'}; |
|
} else { |
|
$r->print('<span class="LC_error">'.&mt('Error').': '. |
|
&mt('Addition of users not permitted for specified default domain: [_1].', |
|
&Apache::lonnet::domain($env{'form.defaultdomain'},'description')).'</span>'); |
|
return 'untrusted'; |
|
} |
|
} |
|
} elsif (($context eq 'domain') && ($setting eq 'domain')) { |
|
if ($env{'form.defaultdomain'} eq $defdom) { |
|
$domain = $env{'form.defaultdomain'}; |
|
} else { |
|
if (&Apache::lonnet::will_trust('domroles',$defdom,$env{'form.defaultdomain'})) { |
|
$domain = $env{'form.defaultdomain'}; |
|
} else { |
|
$r->print('<span class="LC_error">'.&mt('Error').': '. |
|
&mt('Addition of users not permitted for specified default domain: [_1].', |
|
&Apache::lonnet::domain($env{'form.defaultdomain'},'description')).'</span>'); |
|
return 'untrusted'; |
|
} |
|
} |
|
} |
} else { |
} else { |
$domain = $defdom; |
$domain = $defdom; |
} |
} |
Line 3904 sub upfile_drop_add {
|
Line 4227 sub upfile_drop_add {
|
} else { |
} else { |
my %home_servers = &Apache::lonnet::get_servers($defdom,'library'); |
my %home_servers = &Apache::lonnet::get_servers($defdom,'library'); |
if (! exists($home_servers{$desiredhost})) { |
if (! exists($home_servers{$desiredhost})) { |
$r->print('<span class="LC_error">'.&mt('Error'). |
$r->print('<p class="LC_error">'.&mt('Error').': '. |
&mt('Invalid home server specified').'</span>'); |
&mt('Invalid home server specified').'</p>'); |
$r->print(&Apache::loncommon::end_page()); |
return 'invalidhome'; |
return; |
|
} |
} |
} |
} |
# Determine authentication mechanism |
# Determine authentication mechanism |
Line 3931 sub upfile_drop_add {
|
Line 4253 sub upfile_drop_add {
|
if ((defined($env{'form.locarg'})) && ($env{'form.locarg'})) { |
if ((defined($env{'form.locarg'})) && ($env{'form.locarg'})) { |
$genpwd=$env{'form.locarg'}; |
$genpwd=$env{'form.locarg'}; |
} |
} |
|
} elsif ($env{'form.login'} eq 'lti') { |
|
$amode='lti'; |
} |
} |
if ($amode =~ /^krb/) { |
if ($amode =~ /^krb/) { |
if (! defined($genpwd) || $genpwd eq '') { |
if (! defined($genpwd) || $genpwd eq '') { |
Line 3940 sub upfile_drop_add {
|
Line 4264 sub upfile_drop_add {
|
$amode = ''; # This causes the loop below to be skipped |
$amode = ''; # This causes the loop below to be skipped |
} |
} |
} |
} |
my ($defaultsec,$defaultrole); |
my ($defaultsec,$defaultrole,$defaultcredits,$commoncredits); |
if ($context eq 'domain') { |
if ($context eq 'domain') { |
if ($setting eq 'domain') { |
if ($setting eq 'domain') { |
$defaultrole = $env{'form.defaultrole'}; |
$defaultrole = $env{'form.defaultrole'}; |
} elsif ($setting eq 'course') { |
} elsif ($setting eq 'course') { |
$defaultrole = $env{'form.courserole'}; |
$defaultrole = $env{'form.courserole'}; |
$defaultsec = $env{'form.sections'}; |
$defaultsec = $env{'form.sections'}; |
} |
if ($showcredits) { |
|
$commoncredits = $env{'form.credits'}; |
|
if ($crstype ne 'Community') { |
|
my %coursehash=&Apache::lonnet::coursedescription($cid); |
|
$defaultcredits = $coursehash{'internal.defaultcredits'}; |
|
} |
|
} |
|
} |
} elsif ($context eq 'author') { |
} elsif ($context eq 'author') { |
$defaultrole = $env{'form.defaultrole'}; |
$defaultrole = $env{'form.defaultrole'}; |
} elsif ($context eq 'course') { |
} elsif ($context eq 'course') { |
$defaultrole = $env{'form.defaultrole'}; |
$defaultrole = $env{'form.defaultrole'}; |
$defaultsec = $env{'form.sections'}; |
$defaultsec = $env{'form.sections'}; |
|
if ($showcredits) { |
|
$commoncredits = $env{'form.credits'}; |
|
$defaultcredits = $env{'course.'.$cid.'.internal.defaultcredits'}; |
|
} |
} |
} |
# Check to see if user information can be changed |
# Check to see if user information can be changed |
my @userinfo = ('firstname','middlename','lastname','generation', |
my @userinfo = ('firstname','middlename','lastname','generation', |
Line 3996 sub upfile_drop_add {
|
Line 4331 sub upfile_drop_add {
|
} |
} |
} |
} |
} |
} |
|
if ($datatoken eq '') { |
|
$r->print('<p class="LC_error">'.&mt('Error').': '. |
|
&mt('Invalid datatoken').'</p>'); |
|
return 'missingdata'; |
|
} |
if ( $domain eq &LONCAPA::clean_domain($domain) |
if ( $domain eq &LONCAPA::clean_domain($domain) |
&& ($amode ne '')) { |
&& ($amode ne '')) { |
####################################### |
####################################### |
Line 4065 sub upfile_drop_add {
|
Line 4405 sub upfile_drop_add {
|
my $newuserdom = $env{'request.role.domain'}; |
my $newuserdom = $env{'request.role.domain'}; |
map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes); |
map { $cancreate{$_} = &can_create_user($newuserdom,$context,$_); } keys(%longtypes); |
# Get new users list |
# Get new users list |
|
my (%existinguser,%userinfo,%disallow,%rulematch,%inst_results,%alerts,%checkuname); |
|
my $counter = -1; |
|
my (%willtrust,%trustchecked); |
foreach my $line (@userdata) { |
foreach my $line (@userdata) { |
|
$counter ++; |
my @secs; |
my @secs; |
my %entries=&Apache::loncommon::record_sep($line); |
my %entries=&Apache::loncommon::record_sep($line); |
# Determine user name |
# Determine user name |
Line 4097 sub upfile_drop_add {
|
Line 4441 sub upfile_drop_add {
|
if ($entries{$fields{'username'}} =~ /\s/) { |
if ($entries{$fields{'username'}} =~ /\s/) { |
$nowhitespace = ' - '.&mt('usernames may not contain spaces.'); |
$nowhitespace = ' - '.&mt('usernames may not contain spaces.'); |
} |
} |
$r->print('<br />'. |
$disallow{$counter} = |
&mt('[_1]: Unacceptable username for user [_2] [_3] [_4] [_5]', |
&mt('Unacceptable username [_1] for user [_2] [_3] [_4] [_5]', |
'<b>'.$entries{$fields{'username'}}.'</b>',$fname,$mname,$lname,$gen). |
'"<b>'.$entries{$fields{'username'}}.'</b>"', |
$nowhitespace); |
$fname,$mname,$lname,$gen).$nowhitespace; |
next; |
next; |
} else { |
} else { |
$entries{$fields{'domain'}} =~ s/^\s+|\s+$//g; |
$entries{$fields{'domain'}} =~ s/^\s+|\s+$//g; |
if ($entries{$fields{'domain'}} |
if ($entries{$fields{'domain'}} |
ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) { |
ne &LONCAPA::clean_domain($entries{$fields{'domain'}})) { |
$r->print('<br />'. '<b>'.$entries{$fields{'domain'}}. |
$disallow{$counter} = |
'</b>: '.&mt('Unacceptable domain for user [_2] [_3] [_4] [_5]',$fname,$mname,$lname,$gen)); |
&mt('Unacceptable domain [_1] for user [_2] [_3] [_4] [_5]', |
|
'"<b>'.$entries{$fields{'domain'}}.'</b>"', |
|
$fname,$mname,$lname,$gen); |
next; |
next; |
|
} elsif ($entries{$fields{'domain'}} ne $domain) { |
|
my $possdom = $entries{$fields{'domain'}}; |
|
if ($context eq 'course' || $setting eq 'course') { |
|
unless ($trustchecked{$possdom}) { |
|
$willtrust{$possdom} = &Apache::lonnet::will_trust('enroll',$domain,$possdom); |
|
$trustchecked{$possdom} = 1; |
|
} |
|
} elsif ($context eq 'author') { |
|
unless ($trustchecked{$possdom}) { |
|
$willtrust{$possdom} = &Apache::lonnet::will_trust('othcoau',$domain,$possdom); |
|
} |
|
if ($willtrust{$possdom}) { |
|
$willtrust{$possdom} = &Apache::lonnet::will_trust('coaurem',$possdom,$domain); |
|
} |
|
} |
|
unless ($willtrust{$possdom}) { |
|
$disallow{$counter} = |
|
&mt('Unacceptable domain [_1] for user [_2] [_3] [_4] [_5]', |
|
'"<b>'.$possdom.'</b>"', |
|
$fname,$mname,$lname,$gen); |
|
next; |
|
} |
} |
} |
my $username = $entries{$fields{'username'}}; |
my $username = $entries{$fields{'username'}}; |
my $userdomain = $entries{$fields{'domain'}}; |
my $userdomain = $entries{$fields{'domain'}}; |
Line 4120 sub upfile_drop_add {
|
Line 4488 sub upfile_drop_add {
|
$entries{$fields{'sec'}} =~ s/\W//g; |
$entries{$fields{'sec'}} =~ s/\W//g; |
my $item = $entries{$fields{'sec'}}; |
my $item = $entries{$fields{'sec'}}; |
if ($item eq "none" || $item eq 'all') { |
if ($item eq "none" || $item eq 'all') { |
$r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a reserved word.','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$item)); |
$disallow{$counter} = |
|
&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a reserved word.', |
|
'<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$item); |
next; |
next; |
} elsif (exists($curr_groups{$item})) { |
} elsif (exists($curr_groups{$item})) { |
$r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a course group.','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$item).' '.&mt('Section names and group names must be distinct.')); |
$disallow{$counter} = |
|
&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]" - this is a course group.', |
|
'<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$item).' '. |
|
&mt('Section names and group names must be distinct.'); |
next; |
next; |
} else { |
} else { |
push(@secs,$item); |
push(@secs,$item); |
Line 4135 sub upfile_drop_add {
|
Line 4508 sub upfile_drop_add {
|
if (ref($userlist{$username.':'.$userdomain}) eq 'ARRAY') { |
if (ref($userlist{$username.':'.$userdomain}) eq 'ARRAY') { |
my $currsec = $userlist{$username.':'.$userdomain}[$secidx]; |
my $currsec = $userlist{$username.':'.$userdomain}[$secidx]; |
if ($currsec ne $env{'request.course.sec'}) { |
if ($currsec ne $env{'request.course.sec'}) { |
$r->print('<br />'.&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]".','<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$secs[0]).'<br />'); |
$disallow{$counter} = |
|
&mt('[_1]: Unable to enroll user [_2] [_3] [_4] [_5] in a section named "[_6]".', |
|
'<b>'.$username.'</b>',$fname,$mname,$lname,$gen,$secs[0]); |
if ($currsec eq '') { |
if ($currsec eq '') { |
$r->print(&mt('This user already has an active/future student role in the course, unaffiliated to any section.')); |
$disallow{$counter} .= |
|
&mt('This user already has an active/future student role in the course, unaffiliated to any section.'); |
|
|
} else { |
} else { |
$r->print(&mt('This user already has an active/future role in section "[_1]" of the course.',$currsec)); |
$disallow{$counter} .= |
|
&mt('This user already has an active/future role in section "[_1]" of the course.',$currsec); |
} |
} |
$r->print('<br />'.&mt('Although your current role has privileges to add students to section "[_1]", you do not have privileges to modify existing enrollments in other sections.',$secs[0]).'<br />'); |
$disallow{$counter} .= |
|
'<br />'. |
|
&mt('Although your current role has privileges to add students to section "[_1]", you do not have privileges to modify existing enrollments in other sections.', |
|
$secs[0]); |
next; |
next; |
} |
} |
} |
} |
Line 4194 sub upfile_drop_add {
|
Line 4574 sub upfile_drop_add {
|
} |
} |
if ($role eq '') { |
if ($role eq '') { |
my $rolestr = join(', ',@permitted_roles); |
my $rolestr = join(', ',@permitted_roles); |
$r->print('<br />' |
$disallow{$counter} = |
.&mt('[_1]: You do not have permission to add the requested role [_2] for the user.' |
&mt('[_1]: You do not have permission to add the requested role [_2] for the user.' |
,'<b>'.$entries{$fields{'username'}}.'</b>' |
,'<b>'.$entries{$fields{'username'}}.'</b>' |
,$entries{$fields{'role'}}) |
,$entries{$fields{'role'}}) |
.'<br />' |
.'<br />' |
.&mt('Allowable role(s) is/are: [_1].',$rolestr)."\n" |
.&mt('Allowable role(s) is/are: [_1].',$rolestr); |
); |
|
next; |
next; |
} |
} |
} |
} |
Line 4212 sub upfile_drop_add {
|
Line 4591 sub upfile_drop_add {
|
foreach (\$id,\$fname,\$mname,\$lname,\$gen,\$inststatus) { |
foreach (\$id,\$fname,\$mname,\$lname,\$gen,\$inststatus) { |
$$_ =~ s/(\s+$|^\s+)//g; |
$$_ =~ s/(\s+$|^\s+)//g; |
} |
} |
|
my $credits; |
|
if ($showcredits) { |
|
if (($role eq 'st') && ($crstype ne 'Community')) { |
|
$credits = $entries{$fields{'credits'}}; |
|
if ($credits ne '') { |
|
$credits =~ s/[^\d\.]//g; |
|
} |
|
if ($credits eq '') { |
|
$credits = $commoncredits; |
|
} |
|
if ($credits eq $defaultcredits) { |
|
undef($credits); |
|
} |
|
} |
|
} |
# check against rules |
# check against rules |
my $checkid = 0; |
my $checkid = 0; |
my $newuser = 0; |
my $newuser = 0; |
my (%rulematch,%inst_results,%idinst_results); |
|
my $uhome=&Apache::lonnet::homeserver($username,$userdomain); |
my $uhome=&Apache::lonnet::homeserver($username,$userdomain); |
if ($uhome eq 'no_host') { |
if ($uhome eq 'no_host') { |
if ($userdomain ne $newuserdom) { |
if ($userdomain ne $newuserdom) { |
if ($context eq 'course') { |
if ($context eq 'course') { |
$r->print('<br />'. |
$disallow{$counter} = |
&mt('[_1]: The domain specified ([_2]) is different to that of the course.', |
&mt('[_1]: The domain specified ([_2]) is different to that of the course.', |
'<b>'.$username.'</b>',$userdomain).'<br />'); |
'<b>'.$username.'</b>',$userdomain); |
} elsif ($context eq 'author') { |
} elsif ($context eq 'author') { |
$r->print(&mt('[_1]: The domain specified ([_2]) is different to that of the author.', |
$disallow{$counter} = |
'<b>'.$username.'</b>',$userdomain).'<br />'); |
&mt('[_1]: The domain specified ([_2]) is different to that of the author.', |
|
'<b>'.$username.'</b>',$userdomain); |
} else { |
} else { |
$r->print(&mt('[_1]: The domain specified ([_2]) is different to that of your current role.', |
$disallow{$counter} = |
'<b>'.$username.'</b>',$userdomain).'<br />'); |
&mt('[_1]: The domain specified ([_2]) is different to that of your current role.', |
|
'<b>'.$username.'</b>',$userdomain); |
} |
} |
$r->print(&mt('The user does not already exist, and you may not create a new user in a different domain.')); |
$disallow{$counter} .= |
|
&mt('The user does not already exist, and you may not create a new user in a different domain.'); |
next; |
next; |
|
} else { |
|
unless (($password ne '') || ($env{'form.login'} eq 'loc') || ($env{'form.login'} eq 'lti')) { |
|
$disallow{$counter} = |
|
&mt('[_1]: This is a new user but no default password was provided, and the authentication type requires one.', |
|
'<b>'.$username.'</b>'); |
|
next; |
|
} |
} |
} |
$checkid = 1; |
$checkid = 1; |
$newuser = 1; |
$newuser = 1; |
my $user = $username.':'.$newuserdom; |
$checkuname{$username.':'.$newuserdom} = { 'newuser' => $newuser, 'id' => $id }; |
my $checkhash; |
|
my $checks = { 'username' => 1 }; |
|
$checkhash->{$username.':'.$newuserdom} = { 'newuser' => 1, }; |
|
&Apache::loncommon::user_rule_check($checkhash,$checks, |
|
\%alerts,\%rulematch,\%inst_results,\%curr_rules, |
|
\%got_rules); |
|
if (ref($alerts{'username'}) eq 'HASH') { |
|
if (ref($alerts{'username'}{$newuserdom}) eq 'HASH') { |
|
if ($alerts{'username'}{$newuserdom}{$username}) { |
|
$r->print('<br />'. |
|
&mt('[_1]: matches the username format at your institution, but is not known to your directory service.','<b>'.$username.'</b>').'<br />'. |
|
&mt('Consequently, the user was not created.')); |
|
next; |
|
} |
|
} |
|
} |
|
my $usertype = 'unofficial'; |
|
if (ref($rulematch{$user}) eq 'HASH') { |
|
if ($rulematch{$user}{'username'}) { |
|
$usertype = 'official'; |
|
} |
|
} |
|
unless ($cancreate{$usertype}) { |
|
my $showtype = $longtypes{$usertype}; |
|
$r->print('<br />'. |
|
&mt('[_1]: The user does not exist, and you are not permitted to create users of type: [_2].','<b>'.$username.'</b>',$showtype)); |
|
next; |
|
} |
|
} else { |
} else { |
if ($context eq 'course' || $context eq 'author') { |
if ($context eq 'course' || $context eq 'author') { |
if ($userdomain eq $domain ) { |
if ($userdomain eq $domain ) { |
Line 4296 sub upfile_drop_add {
|
Line 4671 sub upfile_drop_add {
|
} |
} |
} |
} |
} |
} |
|
if ($id) { |
|
$existinguser{$userdomain}{$username} = $id; |
|
} |
} |
} |
if ($id ne '') { |
$userinfo{$counter} = { |
if (!$newuser) { |
username => $username, |
my %idhash = &Apache::lonnet::idrget($userdomain,($username)); |
domain => $userdomain, |
if ($idhash{$username} ne $id) { |
fname => $fname, |
$checkid = 1; |
mname => $mname, |
|
lname => $lname, |
|
gen => $gen, |
|
email => $email, |
|
id => $id, |
|
password => $password, |
|
inststatus => $inststatus, |
|
role => $role, |
|
sections => \@secs, |
|
credits => $credits, |
|
newuser => $newuser, |
|
checkid => $checkid, |
|
}; |
|
} |
|
} |
|
} # end of foreach (@userdata) |
|
if ($counter > -1) { |
|
my $total = $counter + 1; |
|
my %checkids; |
|
if ((keys(%existinguser)) || (keys(%checkuname))) { |
|
$r->print(&mt('Please be patient -- checking for institutional data ...')); |
|
$r->rflush(); |
|
if (keys(%existinguser)) { |
|
foreach my $dom (keys(%existinguser)) { |
|
if (ref($existinguser{$dom}) eq 'HASH') { |
|
my %idhash = &Apache::lonnet::idrget($dom,keys(%{$existinguser{$dom}})); |
|
foreach my $username (keys(%{$existinguser{$dom}})) { |
|
if ($idhash{$username} ne $existinguser{$dom}{$username}) { |
|
$checkids{$username.':'.$dom} = { |
|
'id' => $existinguser{$dom}{$username}, |
|
}; |
|
} |
|
} |
|
if (keys(%checkids)) { |
|
&Apache::loncommon::user_rule_check(\%checkids,{ 'id' => 1 }, |
|
\%alerts,\%rulematch, |
|
\%inst_results,\%curr_rules, |
|
\%got_rules); |
|
} |
|
} |
|
} |
|
} |
|
if (keys(%checkuname)) { |
|
&Apache::loncommon::user_rule_check(\%checkuname,{ 'username' => 1, 'id' => 1, }, |
|
\%alerts,\%rulematch,\%inst_results, |
|
\%curr_rules,\%got_rules); |
|
} |
|
$r->print(' '.&mt('done').'<br /><br />'); |
|
$r->rflush(); |
|
} |
|
my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,$total); |
|
$r->print('<ul>'); |
|
for (my $i=0; $i<=$counter; $i++) { |
|
if ($disallow{$i}) { |
|
$r->print('<li>'.$disallow{$i}.'</li>'); |
|
} elsif (ref($userinfo{$i}) eq 'HASH') { |
|
my $password = $userinfo{$i}{'password'}; |
|
my $newuser = $userinfo{$i}{'newuser'}; |
|
my $checkid = $userinfo{$i}{'checkid'}; |
|
my $id = $userinfo{$i}{'id'}; |
|
my $role = $userinfo{$i}{'role'}; |
|
my @secs; |
|
if (ref($userinfo{$i}{'sections'}) eq 'ARRAY') { |
|
@secs = @{$userinfo{$i}{'sections'}}; |
|
} |
|
my $fname = $userinfo{$i}{'fname'}; |
|
my $mname = $userinfo{$i}{'mname'}; |
|
my $lname = $userinfo{$i}{'lname'}; |
|
my $gen = $userinfo{$i}{'gen'}; |
|
my $email = $userinfo{$i}{'email'}; |
|
my $inststatus = $userinfo{$i}{'inststatus'}; |
|
my $credits = $userinfo{$i}{'credits'}; |
|
my $username = $userinfo{$i}{'username'}; |
|
my $userdomain = $userinfo{$i}{'domain'}; |
|
my $user = $username.':'.$userdomain; |
|
if ($newuser) { |
|
if (ref($alerts{'username'}) eq 'HASH') { |
|
if (ref($alerts{'username'}{$userdomain}) eq 'HASH') { |
|
if ($alerts{'username'}{$userdomain}{$username}) { |
|
$r->print('<li>'. |
|
&mt('[_1]: matches the username format at your institution, but is not known to your directory service.','<b>'.$username.'</b>').'<br />'. |
|
&mt('Consequently, the user was not created.').'</li>'); |
|
next; |
|
} |
} |
} |
} |
} |
if ($checkid) { |
if (ref($inst_results{$user}) eq 'HASH') { |
my $checkhash; |
if ($inst_results{$user}{'firstname'} ne '') { |
my $checks = { 'id' => 1 }; |
$fname = $inst_results{$user}{'firstname'}; |
$checkhash->{$username.':'.$userdomain} = { 'newuser' => $newuser, |
} |
'id' => $id }; |
if ($inst_results{$user}{'middlename'} ne '') { |
&Apache::loncommon::user_rule_check($checkhash,$checks, |
$mname = $inst_results{$user}{'middlename'}; |
\%alerts,\%rulematch,\%idinst_results,\%curr_rules, |
} |
\%got_rules); |
if ($inst_results{$user}{'lasttname'} ne '') { |
|
$lname = $inst_results{$user}{'lastname'}; |
|
} |
|
if ($inst_results{$user}{'permanentemail'} ne '') { |
|
$email = $inst_results{$user}{'permanentemail'}; |
|
} |
|
if ($inst_results{$user}{'id'} ne '') { |
|
$id = $inst_results{$user}{'id'}; |
|
$checkid = 0; |
|
} |
|
if (ref($inst_results{$user}{'inststatus'}) eq 'ARRAY') { |
|
$inststatus = join(':',@{$inst_results{$user}{'inststatus'}}); |
|
} |
|
} |
|
if (($checkid) && ($id ne '')) { |
if (ref($alerts{'id'}) eq 'HASH') { |
if (ref($alerts{'id'}) eq 'HASH') { |
if (ref($alerts{'id'}{$userdomain}) eq 'HASH') { |
if (ref($alerts{'id'}{$userdomain}) eq 'HASH') { |
if ($alerts{'id'}{$userdomain}{$id}) { |
if ($alerts{'id'}{$userdomain}{$username}) { |
$r->print(&mt('[_1]: has a student/employee ID matching the format at your institution, but the ID is found by your directory service.', |
$r->print('<li>'. |
|
&mt('[_1]: has a student/employee ID matching the format at your institution, but the ID is not found by your directory service.', |
'<b>'.$username.'</b>').'<br />'. |
'<b>'.$username.'</b>').'<br />'. |
&mt('Consequently, the user was not created.')); |
&mt('Consequently, the user was not created.').'</li>'); |
next; |
next; |
} |
} |
} |
} |
} |
} |
} |
} |
|
my $usertype = 'unofficial'; |
|
if (ref($rulematch{$user}) eq 'HASH') { |
|
if ($rulematch{$user}{'username'}) { |
|
$usertype = 'official'; |
|
} |
|
} |
|
unless ($cancreate{$usertype}) { |
|
my $showtype = $longtypes{$usertype}; |
|
$r->print('<li>'. |
|
&mt('[_1]: The user does not exist, and you are not permitted to create users of type: [_2].','<b>'.$username.'</b>',$showtype).'</li>'); |
|
next; |
|
} |
|
} elsif ($id ne '') { |
|
if (exists($checkids{$user})) { |
|
$checkid = 1; |
|
if (ref($alerts{'id'}) eq 'HASH') { |
|
if (ref($alerts{'id'}{$userdomain}) eq 'HASH') { |
|
if ($alerts{'id'}{$userdomain}{$username}) { |
|
$r->print('<li>'. |
|
&mt('[_1]: has a student/employee ID matching the format at your institution, but the ID is not found by your directory service.', |
|
'<b>'.$username.'</b>').'<br />'. |
|
&mt('Consequently, the ID was not changed.').'</li>'); |
|
$id = ''; |
|
} |
|
} |
|
} |
|
} |
} |
} |
if ($password || $env{'form.login'} eq 'loc') { |
my $multiple = 0; |
my $multiple = 0; |
my ($userresult,$authresult,$roleresult,$idresult); |
my ($userresult,$authresult,$roleresult,$idresult); |
my (%userres,%authres,%roleres,%idres); |
my (%userres,%authres,%roleres,%idres); |
my $singlesec = ''; |
my $singlesec = ''; |
if ($role eq 'st') { |
if ($role eq 'st') { |
my $sec; |
my $sec; |
if (ref($userinfo{$i}{'sections'}) eq 'ARRAY') { |
if (@secs > 0) { |
if (@secs > 0) { |
$sec = $secs[0]; |
$sec = $secs[0]; |
} |
} |
&modifystudent($userdomain,$username,$cid,$sec, |
} |
$desiredhost,$context); |
&modifystudent($userdomain,$username,$cid,$sec, |
$roleresult = |
$desiredhost,$context); |
&Apache::lonnet::modifystudent |
$roleresult = |
($userdomain,$username,$id,$amode,$password, |
&Apache::lonnet::modifystudent |
$fname,$mname,$lname,$gen,$sec,$enddate, |
($userdomain,$username,$id,$amode,$password, |
$startdate,$env{'form.forceid'}, |
$fname,$mname,$lname,$gen,$sec,$enddate, |
$desiredhost,$email,'manual','',$cid, |
$startdate,$env{'form.forceid'}, |
'',$context,$inststatus); |
$desiredhost,$email,'manual','',$cid, |
$userresult = $roleresult; |
'',$context,$inststatus,$credits); |
} else { |
$userresult = $roleresult; |
if ($role ne '') { |
} else { |
if ($context eq 'course' || $setting eq 'course') { |
if ($role ne '') { |
if ($customroles{$role}) { |
if ($context eq 'course' || $setting eq 'course') { |
$role = 'cr_'.$env{'user.domain'}.'_'. |
if ($customroles{$role}) { |
$env{'user.name'}.'_'.$role; |
$role = 'cr_'.$env{'user.domain'}.'_'. |
} |
$env{'user.name'}.'_'.$role; |
if (($role ne 'cc') && ($role ne 'co')) { |
} |
if (@secs > 1) { |
if (($role ne 'cc') && ($role ne 'co')) { |
$multiple = 1; |
if (@secs > 1) { |
foreach my $sec (@secs) { |
$multiple = 1; |
($userres{$sec},$authres{$sec},$roleres{$sec},$idres{$sec}) = |
foreach my $sec (@secs) { |
&modifyuserrole($context,$setting, |
($userres{$sec},$authres{$sec},$roleres{$sec},$idres{$sec}) = |
$changeauth,$cid,$userdomain,$username, |
&modifyuserrole($context,$setting, |
$id,$amode,$password,$fname, |
$changeauth,$cid,$userdomain,$username, |
$mname,$lname,$gen,$sec, |
$id,$amode,$password,$fname, |
$env{'form.forceid'},$desiredhost, |
$mname,$lname,$gen,$sec, |
$email,$role,$enddate, |
$env{'form.forceid'},$desiredhost, |
$startdate,$checkid,$inststatus); |
$email,$role,$enddate, |
} |
$startdate,$checkid,$inststatus); |
} elsif (@secs > 0) { |
|
$singlesec = $secs[0]; |
|
} |
} |
|
} elsif (@secs > 0) { |
|
$singlesec = $secs[0]; |
} |
} |
} |
} |
} |
} |
Line 4381 sub upfile_drop_add {
|
Line 4884 sub upfile_drop_add {
|
$checkid,$inststatus); |
$checkid,$inststatus); |
} |
} |
} |
} |
if ($multiple) { |
} |
foreach my $sec (sort(keys(%userres))) { |
if ($multiple) { |
$flushc = |
foreach my $sec (sort(keys(%userres))) { |
|
$flushc = |
&user_change_result($r,$userres{$sec},$authres{$sec}, |
&user_change_result($r,$userres{$sec},$authres{$sec}, |
$roleres{$sec},$idres{$sec},\%counts,$flushc, |
$roleres{$sec},$idres{$sec},\%counts,$flushc, |
$username,$userdomain,\%userchg); |
$username,$userdomain,\%userchg); |
|
|
} |
|
} else { |
|
$flushc = |
|
&user_change_result($r,$userresult,$authresult, |
|
$roleresult,$idresult,\%counts,$flushc, |
|
$username,$userdomain,\%userchg); |
|
} |
} |
} else { |
} else { |
if ($context eq 'course') { |
$flushc = |
$r->print('<br />'. |
&user_change_result($r,$userresult,$authresult, |
&mt('[_1]: Unable to enroll. No password specified.','<b>'.$username.'</b>') |
$roleresult,$idresult,\%counts,$flushc, |
); |
$username,$userdomain,\%userchg); |
} elsif ($context eq 'author') { |
|
$r->print('<br />'. |
|
&mt('[_1]: Unable to add co-author. No password specified.','<b>'.$username.'</b>') |
|
); |
|
} else { |
|
$r->print('<br />'. |
|
&mt('[_1]: Unable to add user. No password specified.','<b>'.$username.'</b>') |
|
); |
|
} |
|
} |
} |
} |
} |
} |
&Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state,'last user'); |
} # end of foreach (@userdata) |
} # end of loop |
|
$r->print('</ul>'); |
|
&Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); |
|
} |
# Flush the course logs so reverse user roles immediately updated |
# Flush the course logs so reverse user roles immediately updated |
$r->register_cleanup(\&Apache::lonnet::flushcourselogs); |
$r->register_cleanup(\&Apache::lonnet::flushcourselogs); |
$r->print("</p>\n<p>\n".&mt('Processed [quant,_1,user].',$counts{'user'}). |
$r->print("</p>\n<p>\n".&mt('Processed [quant,_1,user].',$counts{'user'}). |
"</p>\n"); |
"</p>\n"); |
if ($counts{'role'} > 0) { |
if ($counts{'role'} > 0) { |
$r->print("<p>\n". |
$r->print("<p>\n". |
&mt('Roles added for [quant,_1,user].',$counts{'role'}).' '.&mt('If a user is currently logged-in to LON-CAPA, any new roles which are active will be available when the user next logs in.')."</p>\n"); |
&mt('Roles added for [quant,_1,user].',$counts{'role'}).' '. |
|
&mt('If a user is currently logged-in to LON-CAPA, any new roles which are active will be available when the user next logs in.'). |
|
"</p>\n"); |
} else { |
} else { |
$r->print('<p>'.&mt('No roles added').'</p>'); |
$r->print('<p>'.&mt('No roles added').'</p>'); |
} |
} |
Line 4437 sub upfile_drop_add {
|
Line 4931 sub upfile_drop_add {
|
# Get current classlist |
# Get current classlist |
my $classlist = &Apache::loncoursedata::get_classlist(); |
my $classlist = &Apache::loncoursedata::get_classlist(); |
if (! defined($classlist)) { |
if (! defined($classlist)) { |
$r->print('<form name="studentform" method="post" action="/adm/createuser" />'. |
$r->print('<p class="LC_info">'. |
'<input type="hidden" name="action" value="'.$env{'form.action'}.'" />'. |
|
&mt('There are no students with current/future access to the course.'). |
&mt('There are no students with current/future access to the course.'). |
'</form>'."\n"); |
'</p>'."\n"); |
} elsif (ref($classlist) eq 'HASH') { |
} elsif (ref($classlist) eq 'HASH') { |
# Remove the students we just added from the list of students. |
# Remove the students we just added from the list of students. |
foreach my $line (@userdata) { |
foreach my $line (@userdata) { |
Line 4456 sub upfile_drop_add {
|
Line 4949 sub upfile_drop_add {
|
} |
} |
} |
} |
} # end of unless |
} # end of unless |
if ($env{'form.fullup'} ne 'yes') { |
return 'ok'; |
$r->print('</form>'); |
|
} |
|
} |
} |
|
|
sub print_namespacing_alerts { |
sub print_namespacing_alerts { |
Line 4505 sub user_change_result {
|
Line 4996 sub user_change_result {
|
my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc, |
my ($r,$userresult,$authresult,$roleresult,$idresult,$counts,$flushc, |
$username,$userdomain,$userchg) = @_; |
$username,$userdomain,$userchg) = @_; |
my $okresult = 0; |
my $okresult = 0; |
|
my @status; |
if ($userresult ne 'ok') { |
if ($userresult ne 'ok') { |
if ($userresult =~ /^error:(.+)$/) { |
if ($userresult =~ /^error:(.+)$/) { |
my $error = $1; |
my $error = $1; |
$r->print('<br />'. |
push(@status, |
&mt('[_1]: Unable to add/modify: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); |
&mt('[_1]: Unable to add/modify: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); |
} |
} |
} else { |
} else { |
$counts->{'user'} ++; |
$counts->{'user'} ++; |
Line 4518 sub user_change_result {
|
Line 5010 sub user_change_result {
|
if ($authresult ne 'ok') { |
if ($authresult ne 'ok') { |
if ($authresult =~ /^error:(.+)$/) { |
if ($authresult =~ /^error:(.+)$/) { |
my $error = $1; |
my $error = $1; |
$r->print('<br />'. |
push(@status, |
&mt('[_1]: Unable to modify authentication: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); |
&mt('[_1]: Unable to modify authentication: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); |
} |
} |
} else { |
} else { |
$counts->{'auth'} ++; |
$counts->{'auth'} ++; |
Line 4528 sub user_change_result {
|
Line 5020 sub user_change_result {
|
if ($roleresult ne 'ok') { |
if ($roleresult ne 'ok') { |
if ($roleresult =~ /^error:(.+)$/) { |
if ($roleresult =~ /^error:(.+)$/) { |
my $error = $1; |
my $error = $1; |
$r->print('<br />'. |
push(@status, |
&mt('[_1]: Unable to add role: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); |
&mt('[_1]: Unable to add role: [_2]','<b>'.$username.':'.$userdomain.'</b>',$error)); |
} |
} |
} else { |
} else { |
$counts->{'role'} ++; |
$counts->{'role'} ++; |
Line 4538 sub user_change_result {
|
Line 5030 sub user_change_result {
|
if ($okresult) { |
if ($okresult) { |
$flushc++; |
$flushc++; |
$userchg->{$username.':'.$userdomain}=1; |
$userchg->{$username.':'.$userdomain}=1; |
$r->print('. '); |
|
if ($flushc>15) { |
if ($flushc>15) { |
$r->rflush; |
$r->rflush; |
$flushc=0; |
$flushc=0; |
} |
} |
} |
} |
if ($idresult) { |
if ($idresult) { |
$r->print($idresult); |
push(@status,$idresult); |
|
} |
|
if (@status) { |
|
$r->print('<li>'.join('<br />',@status).'</li>'); |
} |
} |
return $flushc; |
return $flushc; |
} |
} |
Line 4560 sub print_drop_menu {
|
Line 5054 sub print_drop_menu {
|
$heading = &mt("Drop Students"); |
$heading = &mt("Drop Students"); |
} |
} |
$r->print('<h3>'.$heading.'</h3>'."\n". |
$r->print('<h3>'.$heading.'</h3>'."\n". |
'<form name="studentform" method="post">'."\n"); |
'<form name="studentform" method="post" action="">'."\n"); |
my $classlist = &Apache::loncoursedata::get_classlist(); |
my $classlist = &Apache::loncoursedata::get_classlist(); |
if (! defined($classlist)) { |
if (! defined($classlist)) { |
|
my $msg = ''; |
if ($crstype eq 'Community') { |
if ($crstype eq 'Community') { |
$r->print(&mt('There are no members currently enrolled.')."\n"); |
$msg = &mt('There are no members currently enrolled.'); |
} else { |
} else { |
$r->print(&mt('There are no students currently enrolled.')."\n"); |
$msg = &mt('There are no students currently enrolled.'); |
} |
} |
|
$r->print('<p class="LC_info">'.$msg."</p>\n"); |
} else { |
} else { |
&show_drop_list($r,$classlist,'nosort',$permission,$crstype); |
&show_drop_list($r,$classlist,'nosort',$permission,$crstype); |
} |
} |
$r->print('</form>'. &Apache::loncommon::end_page()); |
$r->print('</form>'); |
return; |
return; |
} |
} |
|
|
Line 4614 sub update_user_list {
|
Line 5110 sub update_user_list {
|
foreach my $item (@changelist) { |
foreach my $item (@changelist) { |
my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype, |
my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype, |
@sections,$scopestem,$singlesec,$showsecs,$warn_singlesec, |
@sections,$scopestem,$singlesec,$showsecs,$warn_singlesec, |
$nothingtodo,$keepnosection); |
$nothingtodo,$keepnosection,$credits,$instsec); |
if ($choice eq 'drop') { |
if ($choice eq 'drop') { |
($uname,$udom,$sec) = split(/:/,$item,-1); |
($uname,$udom,$sec) = split(/:/,$item,-1); |
$role = 'st'; |
$role = 'st'; |
Line 4627 sub update_user_list {
|
Line 5123 sub update_user_list {
|
$scope = $scopestem.'/'.$sec; |
$scope = $scopestem.'/'.$sec; |
} |
} |
} elsif ($context eq 'course') { |
} elsif ($context eq 'course') { |
($uname,$udom,$role,$sec,$type,$locktype) = split(/\:/,$item,-1); |
($uname,$udom,$role,$sec,$type,$locktype,$credits,$instsec) = |
|
split(/\:/,$item,8); |
|
$instsec = &unescape($instsec); |
$cid = $env{'request.course.id'}; |
$cid = $env{'request.course.id'}; |
$scopestem = '/'.$cid; |
$scopestem = '/'.$cid; |
$scopestem =~s/\_/\//g; |
$scopestem =~s/\_/\//g; |
Line 4646 sub update_user_list {
|
Line 5144 sub update_user_list {
|
} elsif ($setting eq 'author') { |
} elsif ($setting eq 'author') { |
($uname,$udom,$role,$scope) = split(/\:/,$item); |
($uname,$udom,$role,$scope) = split(/\:/,$item); |
} elsif ($setting eq 'course') { |
} elsif ($setting eq 'course') { |
($uname,$udom,$role,$cid,$sec,$type,$locktype) = |
($uname,$udom,$role,$cid,$sec,$type,$locktype,$credits,$instsec) = |
split(/\:/,$item); |
split(/\:/,$item,9); |
|
$instsec = &unescape($instsec); |
$scope = '/'.$cid; |
$scope = '/'.$cid; |
$scope =~s/\_/\//g; |
$scope =~s/\_/\//g; |
if ($sec ne '') { |
if ($sec ne '') { |
Line 4669 sub update_user_list {
|
Line 5168 sub update_user_list {
|
$end = $now; |
$end = $now; |
if ($role eq 'st') { |
if ($role eq 'st') { |
$result = |
$result = |
&Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); |
&Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits,$instsec); |
} else { |
} else { |
$result = |
$result = |
&Apache::lonnet::revokerole($udom,$uname,$scope,$role, |
&Apache::lonnet::revokerole($udom,$uname,$scope,$role, |
Line 4677 sub update_user_list {
|
Line 5176 sub update_user_list {
|
} |
} |
} elsif ($choice eq 'delete') { |
} elsif ($choice eq 'delete') { |
if ($role eq 'st') { |
if ($role eq 'st') { |
&Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context); |
&Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$now,$start,$type,$locktype,$cid,'',$context,$credits,$instsec); |
} |
} |
$result = |
$result = |
&Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now, |
&Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now, |
Line 4690 sub update_user_list {
|
Line 5189 sub update_user_list {
|
} |
} |
if ($choice eq 'reenable') { |
if ($choice eq 'reenable') { |
if ($role eq 'st') { |
if ($role eq 'st') { |
$result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); |
$result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits,$instsec); |
} else { |
} else { |
$result = |
$result = |
&Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, |
&Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, |
Line 4698 sub update_user_list {
|
Line 5197 sub update_user_list {
|
} |
} |
} elsif ($choice eq 'activate') { |
} elsif ($choice eq 'activate') { |
if ($role eq 'st') { |
if ($role eq 'st') { |
$result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); |
$result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits,$instsec); |
} else { |
} else { |
$result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, |
$result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, |
$now,'','',$context); |
$now,'','',$context); |
} |
} |
} elsif ($choice eq 'chgdates') { |
} elsif ($choice eq 'chgdates') { |
if ($role eq 'st') { |
if ($role eq 'st') { |
$result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context); |
$result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid,'',$context,$credits,$instsec); |
} else { |
} else { |
$result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, |
$result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end, |
$start,'','',$context); |
$start,'','',$context); |
Line 4775 sub update_user_list {
|
Line 5274 sub update_user_list {
|
} else { |
} else { |
if ($role eq 'st') { |
if ($role eq 'st') { |
$result = |
$result = |
&Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context); |
&Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid,'',$context,$credits,$instsec); |
} else { |
} else { |
my $newscope = $scopestem; |
my $newscope = $scopestem; |
$result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context); |
$result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start,'','',$context); |
Line 4789 sub update_user_list {
|
Line 5288 sub update_user_list {
|
foreach my $newsec (@newsecs) { |
foreach my $newsec (@newsecs) { |
if (!grep(/^\Q$newsec\E$/,@retained)) { |
if (!grep(/^\Q$newsec\E$/,@retained)) { |
if ($role eq 'st') { |
if ($role eq 'st') { |
$result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context); |
$result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid,'',$context,$credits,$instsec); |
if (@newsecs > 1) { |
if (@newsecs > 1) { |
my $showsingle; |
my $showsingle; |
if ($newsec eq '') { |
if ($newsec eq '') { |
Line 4900 sub update_user_list {
|
Line 5399 sub update_user_list {
|
} |
} |
} |
} |
} |
} |
$r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} for [quant,_1,user role,user roles,no user roles].",$count).'</b></p>'); |
$r->print('<p><b>'.&mt("$result_text{'ok'}{$choice} [quant,_1,user role,user roles,no user roles].",$count).'</b></p>'); |
if ($count > 0) { |
if ($count > 0) { |
if ($choice eq 'revoke' || $choice eq 'drop') { |
if ($choice eq 'revoke' || $choice eq 'drop') { |
$r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>'); |
$r->print('<p>'.&mt('Re-enabling will re-activate data for the role.').'</p>'); |
Line 4917 sub update_user_list {
|
Line 5416 sub update_user_list {
|
if ($choice eq 'drop') { |
if ($choice eq 'drop') { |
$linktext = &mt('Display current class roster'); |
$linktext = &mt('Display current class roster'); |
} |
} |
$r->print('<a href="javascript:document.studentform.submit()">'.$linktext.'</a></form>'."\n"); |
$r->print( |
|
&Apache::lonhtmlcommon::actionbox( |
|
['<a href="javascript:document.studentform.submit()">'.$linktext.'</a>']) |
|
.'</form>'."\n"); |
} |
} |
|
|
sub dates_feedback { |
sub dates_feedback { |
Line 4925 sub dates_feedback {
|
Line 5427 sub dates_feedback {
|
my $dates; |
my $dates; |
if ($start < $now) { |
if ($start < $now) { |
if ($end == 0) { |
if ($end == 0) { |
$dates .= &mt('role(s) active now; no end date'); |
$dates = &mt('role(s) active now; no end date'); |
} elsif ($end > $now) { |
} elsif ($end > $now) { |
$dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end)); |
$dates = &mt('role(s) active now; ends [_1].',&Apache::lonlocal::locallocaltime($end)); |
} else { |
} else { |
Line 4964 sub active_student_roles {
|
Line 5466 sub active_student_roles {
|
|
|
sub section_check_js { |
sub section_check_js { |
my $groupslist= &get_groupslist(); |
my $groupslist= &get_groupslist(); |
|
my %js_lt = &Apache::lonlocal::texthash( |
|
mayn => 'may not be used as the name for a section, as it is a reserved word.', |
|
plch => 'Please choose a different section name.', |
|
mnot => 'may not be used as a section name, as it is the name of a course group.', |
|
secn => 'Section names and group names must be distinct. Please choose a different section name.', |
|
); |
|
&js_escape(\%js_lt); |
return <<"END"; |
return <<"END"; |
function validate(caller) { |
function validate(caller) { |
var groups = new Array($groupslist); |
var groups = new Array($groupslist); |
var secname = caller.value; |
var secname = caller.value; |
if ((secname == 'all') || (secname == 'none')) { |
if ((secname == 'all') || (secname == 'none')) { |
alert("'"+secname+"' may not be used as the name for a section, as it is a reserved word.\\nPlease choose a different section name."); |
alert("'"+secname+"' $js_lt{'mayn'}\\n$js_lt{'plch'}"); |
return 'error'; |
return 'error'; |
} |
} |
if (secname != '') { |
if (secname != '') { |
for (var k=0; k<groups.length; k++) { |
for (var k=0; k<groups.length; k++) { |
if (secname == groups[k]) { |
if (secname == groups[k]) { |
alert("'"+secname+"' may not be used as the name for a section, as it is the name of a course group.\\nSection names and group names must be distinct. Please choose a different section name."); |
alert("'"+secname+"' $js_lt{'mnot'}\\n$js_lt{'secn'}"); |
return 'error'; |
return 'error'; |
} |
} |
} |
} |
Line 4986 END
|
Line 5495 END
|
} |
} |
|
|
sub set_login { |
sub set_login { |
my ($dom,$authformkrb,$authformint,$authformloc) = @_; |
my ($dom,$authformkrb,$authformint,$authformloc,$authformlti) = @_; |
my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); |
my %domconfig = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); |
my $response; |
my $response; |
my ($authnum,%can_assign) = |
my ($authnum,%can_assign) = |
Line 5008 sub set_login {
|
Line 5517 sub set_login {
|
'<td>'.$authformloc.'</td>'. |
'<td>'.$authformloc.'</td>'. |
&Apache::loncommon::end_data_table_row()."\n"; |
&Apache::loncommon::end_data_table_row()."\n"; |
} |
} |
|
if ($can_assign{'lti'}) { |
|
$response .= &Apache::loncommon::start_data_table_row(). |
|
'<td>'.$authformlti.'</td>'. |
|
&Apache::loncommon::end_data_table_row()."\n"; |
|
} |
$response .= &Apache::loncommon::end_data_table(); |
$response .= &Apache::loncommon::end_data_table(); |
} |
} |
return $response; |
return $response; |
} |
} |
|
|
sub course_sections { |
sub course_sections { |
my ($sections_count,$role,$current_sec) = @_; |
my ($sections_count,$role,$current_sec,$disabled) = @_; |
my $output = ''; |
my $output = ''; |
my @sections = (sort {$a <=> $b} keys %{$sections_count}); |
my @sections = (sort {$a <=> $b} keys(%{$sections_count})); |
my $numsec = scalar(@sections); |
my $numsec = scalar(@sections); |
my $is_selected = ' selected="selected"'; |
my $is_selected = ' selected="selected"'; |
if ($numsec <= 1) { |
if ($numsec <= 1) { |
$output = '<select name="currsec_'.$role.'" >'."\n". |
$output = '<select name="currsec_'.$role.'"'.$disabled.'>'."\n". |
' <option value="">'.&mt('Select').'</option>'."\n"; |
' <option value="">'.&mt('Select').'</option>'."\n"; |
if ($current_sec eq 'none') { |
if ($current_sec eq 'none') { |
$output .= |
$output .= |
Line 5043 sub course_sections {
|
Line 5557 sub course_sections {
|
my $multiple = 4; |
my $multiple = 4; |
if (scalar(@sections) < 4) { $multiple = scalar(@sections); } |
if (scalar(@sections) < 4) { $multiple = scalar(@sections); } |
if ($role eq 'st') { |
if ($role eq 'st') { |
$output .= '>'."\n". |
$output .= $disabled.'>'."\n". |
' <option value="">'.&mt('Select').'</option>'."\n"; |
' <option value="">'.&mt('Select').'</option>'."\n"; |
if ($current_sec eq 'none') { |
if ($current_sec eq 'none') { |
$output .= |
$output .= |
Line 5053 sub course_sections {
|
Line 5567 sub course_sections {
|
' <option value="">'.&mt('No section')."</option>\n"; |
' <option value="">'.&mt('No section')."</option>\n"; |
} |
} |
} else { |
} else { |
$output .= 'multiple="multiple" size="'.$multiple.'">'."\n"; |
$output .= 'multiple="multiple" size="'.$multiple.'"'.$disabled.'>'."\n"; |
} |
} |
foreach my $sec (@sections) { |
foreach my $sec (@sections) { |
if ($current_sec eq $sec) { |
if ($current_sec eq $sec) { |
Line 5078 sub get_groupslist {
|
Line 5592 sub get_groupslist {
|
} |
} |
|
|
sub setsections_javascript { |
sub setsections_javascript { |
my ($formname,$groupslist,$mode,$checkauth,$crstype) = @_; |
my ($formname,$groupslist,$mode,$checkauth,$crstype,$showcredits) = @_; |
my ($checkincluded,$finish,$rolecode,$setsection_js); |
my ($checkincluded,$finish,$rolecode,$setsection_js); |
if ($mode eq 'upload') { |
if ($mode eq 'upload') { |
$checkincluded = 'formname.name == "'.$formname.'"'; |
$checkincluded = 'formname.name == "'.$formname.'"'; |
$finish = "return 'ok';"; |
$finish = "return 'ok';"; |
$rolecode = "var role = formname.defaultrole.options[formname.defaultrole.selectedIndex].value;\n"; |
$rolecode = "var role = formname.defaultrole.options[formname.defaultrole.selectedIndex].value;\n"; |
} elsif ($formname eq 'cu') { |
} elsif ($formname eq 'cu') { |
$checkincluded = 'formname.elements[i-1].checked == true'; |
if (($crstype eq 'Course') && ($showcredits)) { |
|
$checkincluded = "((role == 'st') && (formname.elements[i-2].checked == true)) || ((role != 'st') && (formname.elements[i-1].checked == true))"; |
|
} else { |
|
$checkincluded = 'formname.elements[i-1].checked == true'; |
|
} |
if ($checkauth) { |
if ($checkauth) { |
$finish = "var authcheck = auth_check();\n". |
$finish = "var authcheck = auth_check();\n". |
" if (authcheck == 'ok') {\n". |
" if (authcheck == 'ok') {\n". |
Line 5096 sub setsections_javascript {
|
Line 5614 sub setsections_javascript {
|
} |
} |
$rolecode = "var match = str.split('_'); |
$rolecode = "var match = str.split('_'); |
var role = match[3];\n"; |
var role = match[3];\n"; |
} elsif ($formname eq 'enrollstudent') { |
} elsif (($formname eq 'enrollstudent') || ($formname eq 'selfenroll')) { |
$checkincluded = 'formname.name == "'.$formname.'"'; |
$checkincluded = 'formname.name == "'.$formname.'"'; |
if ($checkauth) { |
if ($checkauth) { |
$finish = "var authcheck = auth_check();\n". |
$finish = "var authcheck = auth_check();\n". |
Line 5122 sub setsections_javascript {
|
Line 5640 sub setsections_javascript {
|
acor => 'A coordinator role will be added with access to all sections', |
acor => 'A coordinator role will be added with access to all sections', |
inea => 'In each course, each user may only have one student role at a time.', |
inea => 'In each course, each user may only have one student role at a time.', |
inco => 'In each community, each user may only have one member role at a time.', |
inco => 'In each community, each user may only have one member role at a time.', |
youh => 'You had selected ', |
youh => 'You had selected', |
secs => 'sections.', |
secs => 'sections.', |
plmo => 'Please modify your selections so they include no more than one section.', |
plmo => 'Please modify your selections so they include no more than one section.', |
mayn => 'may not be used as the name for a section, as it is a reserved word.', |
mayn => 'may not be used as the name for a section, as it is a reserved word.', |
Line 5130 sub setsections_javascript {
|
Line 5648 sub setsections_javascript {
|
mnot => 'may not be used as a section name, as it is the name of a course group.', |
mnot => 'may not be used as a section name, as it is the name of a course group.', |
secn => 'Section names and group names must be distinct. Please choose a different section name.', |
secn => 'Section names and group names must be distinct. Please choose a different section name.', |
nonw => 'Section names may only contain letters or numbers.', |
nonw => 'Section names may only contain letters or numbers.', |
); |
); |
|
&js_escape(\%alerts); |
$setsection_js .= <<"ENDSECCODE"; |
$setsection_js .= <<"ENDSECCODE"; |
|
|
function setSections(formname,crstype) { |
function setSections(formname,crstype) { |
Line 5141 function setSections(formname,crstype) {
|
Line 5660 function setSections(formname,crstype) {
|
var groups = new Array($groupslist); |
var groups = new Array($groupslist); |
for (var i=0;i<formname.elements.length;i++) { |
for (var i=0;i<formname.elements.length;i++) { |
var str = formname.elements[i].name; |
var str = formname.elements[i].name; |
|
if (typeof(str) === "undefined") { |
|
continue; |
|
} |
var checkcurr = str.match(re1); |
var checkcurr = str.match(re1); |
if (checkcurr != null) { |
if (checkcurr != null) { |
var num = i; |
var num = i; |
|
$rolecode |
if ($checkincluded) { |
if ($checkincluded) { |
$rolecode |
|
if (role == 'cc' || role == 'co') { |
if (role == 'cc' || role == 'co') { |
if (role == 'cc') { |
if (role == 'cc') { |
alert("$alerts{'secd'}\\n$alerts{'accr'}"); |
alert("$alerts{'secd'}\\n$alerts{'accr'}"); |
Line 5262 sub can_create_user {
|
Line 5784 sub can_create_user {
|
my $cancreate = 1; |
my $cancreate = 1; |
if (&Apache::lonnet::allowed('mau',$dom)) { |
if (&Apache::lonnet::allowed('mau',$dom)) { |
return $cancreate; |
return $cancreate; |
|
} elsif ($context eq 'domain') { |
|
$cancreate = 0; |
|
return $cancreate; |
} |
} |
if (ref($domconf{'usercreation'}) eq 'HASH') { |
if (ref($domconf{'usercreation'}) eq 'HASH') { |
if (ref($domconf{'usercreation'}{'cancreate'}) eq 'HASH') { |
if (ref($domconf{'usercreation'}{'cancreate'}) eq 'HASH') { |
Line 5341 sub can_modify_userinfo {
|
Line 5866 sub can_modify_userinfo {
|
return %canmodify; |
return %canmodify; |
} |
} |
|
|
|
sub can_change_internalpass { |
|
my ($uname,$udom,$crstype,$permission) = @_; |
|
my $canchange; |
|
if (&Apache::lonnet::allowed('mau',$udom)) { |
|
$canchange = 1; |
|
} elsif ((ref($permission) eq 'HASH') && ($permission->{'mip'}) && |
|
($udom eq $env{'request.role.domain'})) { |
|
unless ($env{'course.'.$env{'request.course.id'}.'.internal.nopasswdchg'}) { |
|
my ($cnum,$cdom) = &get_course_identity(); |
|
if ((&Apache::lonnet::is_course_owner($cdom,$cnum)) && ($udom eq $env{'user.domain'})) { |
|
my $noupdate; |
|
my %owned = &Apache::lonnet::courseiddump($cdom,'.',1,'.', |
|
$env{'user.name'}.':'.$env{'user.domain'}, |
|
undef,undef,undef,'.'); |
|
my %roleshash = &Apache::lonnet::get_my_roles($uname,$udom,'userroles', |
|
['active','future']); |
|
foreach my $key (keys(%roleshash)) { |
|
my ($name,$domain,$role) = split(/:/,$key); |
|
if ($role eq 'st') { |
|
next if (($name eq $cnum) && ($domain eq $cdom)); |
|
if ($owned{$domain.'_'.$name}) { |
|
if (ref($owned{$domain.'_'.$name}) eq 'HASH') { |
|
if ($owned{$domain.'_'.$name}{'nopasswdchg'}) { |
|
$noupdate = 1; |
|
last; |
|
} |
|
} |
|
} else { |
|
$noupdate = 1; |
|
last; |
|
} |
|
} else { |
|
$noupdate = 1; |
|
last; |
|
} |
|
} |
|
unless ($noupdate) { |
|
$canchange = 1; |
|
} |
|
} |
|
} |
|
} |
|
return $canchange; |
|
} |
|
|
sub check_usertype { |
sub check_usertype { |
my ($dom,$uname,$rules,$curr_rules,$got_rules) = @_; |
my ($dom,$uname,$rules,$curr_rules,$got_rules) = @_; |
my $usertype; |
my $usertype; |
Line 5404 sub roles_by_context {
|
Line 5974 sub roles_by_context {
|
} elsif ($context eq 'author') { |
} elsif ($context eq 'author') { |
@allroles = ('ca','aa'); |
@allroles = ('ca','aa'); |
} elsif ($context eq 'domain') { |
} elsif ($context eq 'domain') { |
@allroles = ('li','ad','dg','sc','au','dc'); |
@allroles = ('li','ad','dg','dh','da','sc','au','dc'); |
} |
} |
return @allroles; |
return @allroles; |
} |
} |
Line 5446 sub get_permission {
|
Line 6016 sub get_permission {
|
if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) { |
if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) { |
$permission{'grp_manage'} = 1; |
$permission{'grp_manage'} = 1; |
} |
} |
|
if ($permission{'cusr'}) { |
|
my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; |
|
my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; |
|
my %coursehash = ( |
|
'internal.selfenrollmgrdc' => $env{'course.'.$env{'request.course.id'}.'.internal.selfenrollmgrdc'}, |
|
'internal.selfenrollmgrcc' => $env{'course.'.$env{'request.course.id'}.'.internal.selfenrollmgrcc'}, |
|
'internal.coursecode' => $env{'course.'.$env{'request.course.id'}.'.internal.coursecode'}, |
|
'internal.textbook' =>$env{'course.'.$env{'request.course.id'}.'.internal.textbook'}, |
|
); |
|
my ($managed_by_cc,$managed_by_dc) = &selfenrollment_administration($cdom,$cnum,$crstype,\%coursehash); |
|
if (ref($managed_by_cc) eq 'ARRAY') { |
|
if (@{$managed_by_cc}) { |
|
$permission{'selfenrolladmin'} = 1; |
|
} |
|
} |
|
} |
|
if ($env{'request.course.id'}) { |
|
my $user; |
|
if (($env{'user.name'} ne '') && ($env{'user.domain'} ne '')) { |
|
$user = $env{'user.name'}.':'.$env{'user.domain'}; |
|
} |
|
if (($user ne '') && ($env{'course.'.$env{'request.course.id'}.'.internal.courseowner'} eq |
|
$user)) { |
|
$permission{'owner'} = 1; |
|
if (&Apache::lonnet::allowed('mip',$env{'request.course.id'})) { |
|
$permission{'mip'} = 1; |
|
} |
|
} elsif (($user ne '') && ($env{'course.'.$env{'request.course.id'}.'.internal.co-owners'} ne '')) { |
|
if (grep(/^\Q$user\E$/,split(/,/,$env{'course.'.$env{'request.course.id'}.'.internal.co-owners'}))) { |
|
$permission{'co-owner'} = 1; |
|
} |
|
} |
|
} |
} elsif ($context eq 'author') { |
} elsif ($context eq 'author') { |
$permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'}); |
$permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'}); |
$permission{'view'} = $permission{'cusr'}; |
$permission{'view'} = $permission{'cusr'}; |
Line 5465 sub get_permission {
|
Line 6068 sub get_permission {
|
if (&Apache::lonnet::allowed('ccr',$env{'request.role.domain'})) { |
if (&Apache::lonnet::allowed('ccr',$env{'request.role.domain'})) { |
$permission{'custom'} = 1; |
$permission{'custom'} = 1; |
} |
} |
$permission{'view'} = $permission{'cusr'}; |
if (&Apache::lonnet::allowed('vac',$env{'request.role.domain'})) { |
|
$permission{'activity'} = 1; |
|
} |
|
if (&Apache::lonnet::allowed('vur',$env{'request.role.domain'})) { |
|
$permission{'view'} = 1; |
|
} |
|
if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { |
|
$permission{'owner'} = 1; |
|
} |
} |
} |
my $allowed = 0; |
my $allowed = 0; |
foreach my $perm (values(%permission)) { |
foreach my $perm (values(%permission)) { |
Line 5518 sub get_course_identity {
|
Line 6129 sub get_course_identity {
|
} |
} |
|
|
sub dc_setcourse_js { |
sub dc_setcourse_js { |
my ($formname,$mode,$context) = @_; |
my ($formname,$mode,$context,$showcredits) = @_; |
my ($dc_setcourse_code,$authen_check); |
my ($dc_setcourse_code,$authen_check); |
my $cctext = &Apache::lonnet::plaintext('cc'); |
my $cctext = &Apache::lonnet::plaintext('cc'); |
my $cotext = &Apache::lonnet::plaintext('co'); |
my $cotext = &Apache::lonnet::plaintext('co'); |
Line 5604 function setCourse() {
|
Line 6215 function setCourse() {
|
} |
} |
SCRIPTTOP |
SCRIPTTOP |
if ($mode ne 'upload') { |
if ($mode ne 'upload') { |
$dc_setcourse_code .= (<<"ENDSCRIPT"); |
$dc_setcourse_code .= (<<"SCRIPTMID"); |
var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole |
var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole |
var numcourse = getIndex(document.$formname.dccourse); |
var numcourse = getIndex(document.$formname.dccourse); |
if (numcourse == "-1") { |
if (numcourse == "-1") { |
Line 5630 SCRIPTTOP
|
Line 6241 SCRIPTTOP
|
if (numend != "-1") { |
if (numend != "-1") { |
document.$formname.elements[numend].name = "end"+coursename |
document.$formname.elements[numend].name = "end"+coursename |
} |
} |
|
SCRIPTMID |
|
if ($showcredits) { |
|
$dc_setcourse_code .= <<ENDCRED; |
|
var numcredits = getIndex(document.$formname.credits); |
|
if (numcredits != "-1") { |
|
document.$formname.elements[numcredits].name = "credits"+coursename; |
|
} |
|
ENDCRED |
|
} |
|
$dc_setcourse_code .= <<ENDSCRIPT; |
} |
} |
} |
} |
var authcheck = auth_check(); |
var authcheck = auth_check(); |
Line 5738 sub sectioncheck_alerts {
|
Line 6359 sub sectioncheck_alerts {
|
thwa => 'There was a problem with your course selection', |
thwa => 'There was a problem with your course selection', |
thwc => 'There was a problem with your community selection', |
thwc => 'There was a problem with your community selection', |
); |
); |
|
&js_escape(\%alerts); |
return %alerts; |
return %alerts; |
} |
} |
|
|
Line 5748 sub authcheck_alerts {
|
Line 6370 sub authcheck_alerts {
|
krb => 'You need to specify the Kerberos domain.', |
krb => 'You need to specify the Kerberos domain.', |
ipass => 'You need to specify the initial password.', |
ipass => 'You need to specify the initial password.', |
); |
); |
|
&js_escape(\%alerts); |
return %alerts; |
return %alerts; |
} |
} |
|
|
|
sub is_courseowner { |
|
my ($thiscourse,$courseowner) = @_; |
|
if ($courseowner eq '') { |
|
if ($env{'request.course.id'} eq $thiscourse) { |
|
$courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'}; |
|
} |
|
} |
|
if ($courseowner ne '') { |
|
if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) { |
|
return 1; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub get_selfenroll_titles { |
|
my @row = ('types','registered','enroll_dates','access_dates','section', |
|
'approval','limit'); |
|
my %lt = &Apache::lonlocal::texthash ( |
|
types => 'Users allowed to self-enroll', |
|
registered => 'Registration status (official courses)' , |
|
enroll_dates => 'Dates self-enrollment available', |
|
access_dates => 'Access dates for self-enrolling users', |
|
section => "Self-enrolling users' section", |
|
approval => 'Processing of requests', |
|
limit => 'Enrollment limit', |
|
); |
|
return (\@row,\%lt); |
|
} |
|
|
|
sub selfenroll_default_descs { |
|
my %desc = ( |
|
types => { |
|
dom => &mt('Course domain'), |
|
all => &mt('Any domain'), |
|
'' => &mt('None'), |
|
}, |
|
limit => { |
|
none => &mt('No limit'), |
|
allstudents => &mt('Limit by total students'), |
|
selfenrolled => &mt('Limit by total self-enrolled'), |
|
}, |
|
approval => { |
|
'0' => &mt('Processed automatically'), |
|
'1' => &mt('Queued for approval'), |
|
'2' => &mt('Queued, pending validation'), |
|
}, |
|
registered => { |
|
0 => 'No registration required', |
|
1 => 'Registered students only', |
|
}, |
|
); |
|
return %desc; |
|
} |
|
|
|
sub selfenroll_validation_types { |
|
my @items = ('url','fields','button','markup'); |
|
my %names = &Apache::lonlocal::texthash ( |
|
url => 'Web address of validation server/script', |
|
fields => 'Form fields to send to validator', |
|
button => 'Text for validation button', |
|
markup => 'Validation description (HTML)', |
|
); |
|
my @fields = ('username','domain','uniquecode','course','coursetype','description'); |
|
return (\@items,\%names,\@fields); |
|
} |
|
|
|
sub get_extended_type { |
|
my ($cdom,$cnum,$crstype,$current) = @_; |
|
my $type = 'unofficial'; |
|
my %settings; |
|
if (ref($current) eq 'HASH') { |
|
%settings = %{$current}; |
|
} else { |
|
%settings = &Apache::lonnet::get('environment',['internal.coursecode','internal.textbook'],$cdom,$cnum); |
|
} |
|
if ($crstype eq 'Community') { |
|
$type = 'community'; |
|
} elsif ($crstype eq 'Placement') { |
|
$type = 'placement'; |
|
} elsif ($settings{'internal.coursecode'}) { |
|
$type = 'official'; |
|
} elsif ($settings{'internal.textbook'}) { |
|
$type = 'textbook'; |
|
} |
|
return $type; |
|
} |
|
|
|
sub selfenrollment_administration { |
|
my ($cdom,$cnum,$crstype,$coursehash) = @_; |
|
my %settings; |
|
if (ref($coursehash) eq 'HASH') { |
|
%settings = %{$coursehash}; |
|
} else { |
|
%settings = &Apache::lonnet::get('environment', |
|
['internal.selfenrollmgrdc','internal.selfenrollmgrcc', |
|
'internal.coursecode','internal.textbook'],$cdom,$cnum); |
|
} |
|
my ($possconfigs) = &get_selfenroll_titles(); |
|
my %domdefaults = &Apache::lonnet::get_domain_defaults($cdom); |
|
my $selfenrolltype = &get_extended_type($cdom,$cnum,$crstype,\%settings); |
|
|
|
my (@in_course,@in_domain); |
|
if ($settings{'internal.selfenrollmgrcc'} ne '') { |
|
@in_course = split(/,/,$settings{'internal.selfenrollmgrcc'}); |
|
my @diffs = &Apache::loncommon::compare_arrays($possconfigs,\@in_course); |
|
unless (@diffs) { |
|
return (\@in_course,\@in_domain); |
|
} |
|
} |
|
if ($settings{'internal.selfenrollmgrdc'} ne '') { |
|
my @in_domain = split(/,/,$settings{'internal.selfenrollmgrdc'}); |
|
my @diffs = &Apache::loncommon::compare_arrays(\@in_domain,$possconfigs); |
|
unless (@diffs) { |
|
return (\@in_course,\@in_domain); |
|
} |
|
} |
|
my @combined = @in_course; |
|
push(@combined,@in_domain); |
|
my @diffs = &Apache::loncommon::compare_arrays(\@combined,$possconfigs); |
|
unless (@diffs) { |
|
return (\@in_course,\@in_domain); |
|
} |
|
if ($domdefaults{$selfenrolltype.'selfenrolladmdc'} eq '') { |
|
push(@in_course,@diffs); |
|
} else { |
|
my @defaultdc = split(/,/,$domdefaults{$selfenrolltype.'selfenrolladmdc'}); |
|
foreach my $item (@diffs) { |
|
if (grep(/^\Q$item\E$/,@defaultdc)) { |
|
push(@in_domain,$item); |
|
} else { |
|
push(@in_course,$item); |
|
} |
|
} |
|
} |
|
return (\@in_course,\@in_domain); |
|
} |
|
|
|
sub custom_role_header { |
|
my ($context,$crstype,$templaterolerefs,$prefix) = @_; |
|
my %lt = &Apache::lonlocal::texthash( |
|
sele => 'Select a Template', |
|
); |
|
my ($context_code,$button_code); |
|
if ($context eq 'domain') { |
|
$context_code = &custom_coursetype_switch($crstype,$prefix); |
|
} |
|
if (ref($templaterolerefs) eq 'ARRAY') { |
|
foreach my $role (@{$templaterolerefs}) { |
|
my $display = 'inline'; |
|
if (($context eq 'domain') && ($role eq 'co')) { |
|
$display = 'none'; |
|
} |
|
$button_code .= &make_button_code($role,$crstype,$display,$prefix).' '; |
|
} |
|
} |
|
return <<"END"; |
|
<div class="LC_left_float"> |
|
<fieldset> |
|
<legend>$lt{'sele'}</legend> |
|
$button_code |
|
</fieldset></div> |
|
$context_code |
|
<br clear="all" /> |
|
END |
|
} |
|
|
|
sub custom_coursetype_switch { |
|
my ($crstype,$prefix) = @_; |
|
my ($checkedcourse,$checkedcommunity); |
|
if ($crstype eq 'Community') { |
|
$checkedcommunity = ' checked="checked"'; |
|
} else { |
|
$checkedcourse = ' checked="checked"'; |
|
} |
|
my %lt = &Apache::lonlocal::texthash( |
|
cont => 'Context', |
|
cour => 'Course', |
|
comm => 'Community', |
|
); |
|
return <<"END"; |
|
<div class="LC_left_float"> |
|
<fieldset> |
|
<legend>$lt{'cont'}</legend> |
|
<label> |
|
<input type="radio" name="${prefix}_custrolecrstype" value="Course"$checkedcourse onclick="javascript:customSwitchType('$prefix');" /> |
|
$lt{'cour'} |
|
</label> |
|
<label> |
|
<input type="radio" name="${prefix}_custrolecrstype" value="Community"$checkedcommunity onclick="javascript:customSwitchType('$prefix');" /> |
|
$lt{'comm'} |
|
</label> |
|
</fieldset> |
|
</div> |
|
END |
|
} |
|
|
|
sub custom_role_table { |
|
my ($crstype,$full,$levels,$levelscurrent,$prefix,$add_class,$id) = @_; |
|
return unless ((ref($full) eq 'HASH') && (ref($levels) eq 'HASH') && |
|
(ref($levelscurrent) eq 'HASH')); |
|
my %lt=&Apache::lonlocal::texthash ( |
|
'prv' => "Privilege", |
|
'crl' => "Course Level", |
|
'dml' => "Domain Level", |
|
'ssl' => "System Level"); |
|
my %cr = ( |
|
course => '_c', |
|
domain => '_d', |
|
system => '_s', |
|
); |
|
|
|
my $output=&Apache::loncommon::start_data_table($add_class,$id). |
|
&Apache::loncommon::start_data_table_header_row(). |
|
'<th>'.$lt{'prv'}.'</th><th>'.$lt{'crl'}.'</th><th>'.$lt{'dml'}. |
|
'</th><th>'.$lt{'ssl'}.'</th>'. |
|
&Apache::loncommon::end_data_table_header_row(); |
|
foreach my $priv (sort(keys(%{$full}))) { |
|
my $privtext = &Apache::lonnet::plaintext($priv,$crstype); |
|
$output .= &Apache::loncommon::start_data_table_row(). |
|
'<td><span id="'.$prefix.$priv.'">'.$privtext.'</span></td>'; |
|
foreach my $type ('course','domain','system') { |
|
if (($type eq 'system') && ($priv eq 'bre') && ($crstype eq 'Community')) { |
|
$output .= '<td> </td>'; |
|
} else { |
|
$output .= '<td>'. |
|
($levels->{$type}{$priv}?'<input type="checkbox" id="'.$prefix.$priv.$cr{$type}.'"'. |
|
' name="'.$prefix.$priv.$cr{$type}.'"'. |
|
($levelscurrent->{$type}{$priv}?' checked="checked"':'').' />':' '). |
|
'</td>'; |
|
} |
|
} |
|
$output .= &Apache::loncommon::end_data_table_row(); |
|
} |
|
$output .= &Apache::loncommon::end_data_table(); |
|
return $output; |
|
} |
|
|
|
sub custom_role_privs { |
|
my ($privs,$full,$levels,$levelscurrent)= @_; |
|
return unless ((ref($privs) eq 'HASH') && (ref($full) eq 'HASH') && |
|
(ref($levels) eq 'HASH') && (ref($levelscurrent) eq 'HASH')); |
|
my %cr = ( |
|
course => 'cr:c', |
|
domain => 'cr:d', |
|
system => 'cr:s', |
|
); |
|
foreach my $type ('course','domain','system') { |
|
foreach my $item (split(/\:/,$Apache::lonnet::pr{$cr{$type}})) { |
|
my ($priv,$restrict)=split(/\&/,$item); |
|
if (!$restrict) { $restrict='F'; } |
|
$levels->{$type}->{$priv}=$restrict; |
|
if ($privs->{$type}=~/\:$priv/) { |
|
$levelscurrent->{$type}->{$priv}=1; |
|
} |
|
$full->{$priv}=1; |
|
} |
|
} |
|
return; |
|
} |
|
|
|
sub custom_template_roles { |
|
my ($context,$crstype) = @_; |
|
my @template_roles = ("in","ta","ep"); |
|
if (($context eq 'domain') || ($context eq 'domprefs')) { |
|
push(@template_roles,"ad"); |
|
} |
|
push(@template_roles,"st"); |
|
if ($context eq 'domain') { |
|
unshift(@template_roles,('co','cc')); |
|
} else { |
|
if ($crstype eq 'Community') { |
|
unshift(@template_roles,'co'); |
|
} else { |
|
unshift(@template_roles,'cc'); |
|
} |
|
} |
|
return @template_roles; |
|
} |
|
|
|
sub custom_roledefs_js { |
|
my ($context,$crstype,$formname,$full,$templaterolesref,$jsback) = @_; |
|
my $button_code = "\n"; |
|
my $head_script = "\n"; |
|
my (%roletitlestr,$rolenamestr); |
|
my %role_titles = ( |
|
Course => [], |
|
Community => [], |
|
); |
|
$head_script .= '<script type="text/javascript">'."\n" |
|
.'// <![CDATA['."\n"; |
|
if (ref($templaterolesref) eq 'ARRAY') { |
|
if ($context eq 'domain') { |
|
$rolenamestr = join("','",@{$templaterolesref}); |
|
} |
|
foreach my $role (@{$templaterolesref}) { |
|
$head_script .= &make_script_template($role,$crstype,$formname); |
|
if ($context eq 'domain') { |
|
foreach my $type ('Course','Community') { |
|
push(@{$role_titles{$type}},&Apache::lonnet::plaintext($role,$type)); |
|
} |
|
} |
|
} |
|
} |
|
if ($context eq 'domain') { |
|
foreach my $type ('Course','Community') { |
|
$roletitlestr{$type} = join("','",@{$role_titles{$type}}); |
|
} |
|
my %pt = ( |
|
Community => { |
|
cst => &mt('Grant/revoke role of Member'), |
|
mdc => &mt('Edit community contents'), |
|
pch => &mt('Post discussion on community resources'), |
|
pfo => &mt('Print for other users and entire community'), |
|
}, |
|
Course => { |
|
cst => &mt('Grant/revoke role of Student'), |
|
mdc => &mt('Edit course contents'), |
|
pch => &mt('Post discussion on course resources'), |
|
pfo => &mt('Print for other users and entire course'), |
|
}, |
|
); |
|
$head_script .= <<"ENDJS"; |
|
function customSwitchType(prefix) { |
|
var privnames = new Array('cst','mdc','pch','pfo'); |
|
var privtxtcrs = new Array('$pt{Course}{cst}','$pt{Course}{mdc}','$pt{Course}{pch}','$pt{Course}{pfo}'); |
|
var privtxtcom = new Array('$pt{Community}{cst}','$pt{Community}{mdc}','$pt{Community}{pch}','$pt{Community}{pfo}'); |
|
var rolenames = new Array('$rolenamestr'); |
|
var rolescrs = new Array('$roletitlestr{Course}'); |
|
var rolescom = new Array('$roletitlestr{Community}'); |
|
var radio = prefix+'_custrolecrstype'; |
|
if (document.$formname.elements[radio].length > 1) { |
|
for (var i=0; i<document.$formname.elements[radio].length; i++) { |
|
if (document.$formname.elements[radio][i].checked) { |
|
if ((document.getElementById(prefix+'bre_s')) && (document.getElementById(prefix+'bro_s'))) { |
|
if (document.$formname.elements[radio][i].value == 'Community') { |
|
if (document.getElementById(prefix+'bre_s').checked) { |
|
document.getElementById(prefix+'bro_s').checked = true; |
|
document.getElementById(prefix+'bre_s').checked = false; |
|
|
|
} |
|
document.getElementById(prefix+'bre_s').style.visibility = 'hidden'; |
|
} else { |
|
document.getElementById(prefix+'bre_s').style.visibility = 'visible'; |
|
if (document.getElementById(prefix+'bro_s').checked) { |
|
document.getElementById(prefix+'bre_s').checked = true; |
|
document.getElementById(prefix+'bro_s').checked = false; |
|
} |
|
} |
|
} |
|
for (var j=0; j<privnames.length; j++) { |
|
if (document.getElementById(prefix+privnames[j])) { |
|
if (document.getElementById(prefix+privnames[j])) { |
|
if (document.$formname.elements[radio][i].value == 'Course') { |
|
document.getElementById(prefix+privnames[j]).innerHTML = privtxtcrs[j]; |
|
} else { |
|
document.getElementById(prefix+privnames[j]).innerHTML = privtxtcom[j]; |
|
} |
|
} |
|
} |
|
} |
|
for (var j=0; j<rolenames.length; j++) { |
|
if (document.getElementById(prefix+rolenames[j])) { |
|
if (document.getElementById(prefix+rolenames[j])) { |
|
if (document.$formname.elements[radio][i].value == 'Course') { |
|
document.getElementById(prefix+rolenames[j]).value = rolescrs[j]; |
|
if (rolenames[j] == 'cc') { |
|
document.getElementById(prefix+rolenames[j]).style.display = 'inline'; |
|
} |
|
if (rolenames[j] == 'co') { |
|
document.getElementById(prefix+rolenames[j]).style.display = 'none'; |
|
} |
|
} else { |
|
document.getElementById(prefix+rolenames[j]).value = rolescom[j]; |
|
if (rolenames[j] == 'cc') { |
|
document.getElementById(prefix+rolenames[j]).style.display = 'none'; |
|
} |
|
if (rolenames[j] == 'co') { |
|
document.getElementById(prefix+rolenames[j]).style.display = 'inline'; |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
ENDJS |
|
} |
|
$head_script .= "\n".$jsback."\n" |
|
.'// ]]>'."\n" |
|
.'</script>'."\n"; |
|
return $head_script; |
|
} |
|
|
|
# -------------------------------------------------------- |
|
sub make_script_template { |
|
my ($role,$crstype,$formname) = @_; |
|
my $return_script = 'function set_'.$role.'(prefix) {'."\n"; |
|
my (%full_by_level,%role_priv); |
|
foreach my $level ('c','d','s') { |
|
foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:'.$level})) { |
|
next if (($level eq 's') && ($crstype eq 'Community') && ($item eq 'bre&S')); |
|
my ($priv,$restrict)=split(/\&/,$item); |
|
$full_by_level{$level}{$priv}=1; |
|
} |
|
$role_priv{$level} = {}; |
|
my @temp = split(/:/,$Apache::lonnet::pr{$role.':'.$level}); |
|
foreach my $priv (@temp) { |
|
my ($priv_item, $dummy) = split(/\&/,$priv); |
|
$role_priv{$level}{$priv_item} = 1; |
|
} |
|
} |
|
my %to_check = ( |
|
c => ['c','d','s'], |
|
d => ['d','s'], |
|
s => ['s'], |
|
); |
|
foreach my $level ('c','d','s') { |
|
if (ref($full_by_level{$level}) eq 'HASH') { |
|
foreach my $priv (keys(%{$full_by_level{$level}})) { |
|
my $value = 'false'; |
|
if (ref($to_check{$level}) eq 'ARRAY') { |
|
foreach my $lett (@{$to_check{$level}}) { |
|
if (exists($role_priv{$lett}{$priv})) { |
|
$value = 'true'; |
|
last; |
|
} |
|
} |
|
$return_script .= "document.$formname.elements[prefix+'".$priv."_".$level."'].checked = $value;\n"; |
|
} |
|
} |
|
} |
|
} |
|
$return_script .= '}'."\n"; |
|
return ($return_script); |
|
} |
|
# ---------------------------------------------------------- |
|
sub make_button_code { |
|
my ($role,$crstype,$display,$prefix) = @_; |
|
my $label = &Apache::lonnet::plaintext($role,$crstype); |
|
my $button_code = '<input type="button" onclick="set_'.$role."('$prefix'".')" '. |
|
'id="'.$prefix.$role.'" value="'.$label.'" '. |
|
'style="display:'.$display.'" />'; |
|
return ($button_code); |
|
} |
|
|
|
sub custom_role_update { |
|
my ($rolename,$prefix) = @_; |
|
# ------------------------------------------------------- What can be assigned? |
|
my %privs = ( |
|
c => '', |
|
d => '', |
|
s => '', |
|
); |
|
foreach my $level (keys(%privs)) { |
|
foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:'.$level})) { |
|
my ($priv,$restrict)=split(/\&/,$item); |
|
if (!$restrict) { $restrict=''; } |
|
if ($env{'form.'.$prefix.$priv.'_'.$level}) { |
|
$privs{$level} .=':'.$item; |
|
} |
|
} |
|
} |
|
return %privs; |
|
} |
|
|
|
sub adhoc_status_types { |
|
my ($cdom,$context,$role,$selectedref,$othertitle,$usertypes,$types,$disabled) = @_; |
|
my $output = &Apache::loncommon::start_data_table(); |
|
my $numinrow = 3; |
|
my $rem; |
|
if (ref($types) eq 'ARRAY') { |
|
for (my $i=0; $i<@{$types}; $i++) { |
|
if (defined($usertypes->{$types->[$i]})) { |
|
my $rem = $i%($numinrow); |
|
if ($rem == 0) { |
|
if ($i > 0) { |
|
$output .= &Apache::loncommon::end_data_table_row(); |
|
} |
|
$output .= &Apache::loncommon::start_data_table_row(); |
|
} |
|
my $check; |
|
if (ref($selectedref) eq 'ARRAY') { |
|
if (grep(/^\Q$types->[$i]\E$/,@{$selectedref})) { |
|
$check = ' checked="checked"'; |
|
} |
|
} |
|
$output .= '<td>'. |
|
'<span class="LC_nobreak"><label>'. |
|
'<input type="checkbox" name="'.$context.$role.'_status" '. |
|
'value="'.$types->[$i].'"'.$check.$disabled.' />'. |
|
$usertypes->{$types->[$i]}.'</label></span></td>'; |
|
} |
|
} |
|
$rem = @{$types}%($numinrow); |
|
} |
|
my $colsleft = $numinrow - $rem; |
|
if (($rem == 0) && (@{$types} > 0)) { |
|
$output .= &Apache::loncommon::start_data_table_row(); |
|
} |
|
if ($colsleft > 1) { |
|
$output .= '<td colspan="'.$colsleft.'">'; |
|
} else { |
|
$output .= '<td>'; |
|
} |
|
my $defcheck; |
|
if (ref($selectedref) eq 'ARRAY') { |
|
if (grep(/^default$/,@{$selectedref})) { |
|
$defcheck = ' checked="checked"'; |
|
} |
|
} |
|
$output .= '<span class="LC_nobreak"><label>'. |
|
'<input type="checkbox" name="'.$context.$role.'_status"'. |
|
'value="default"'.$defcheck.$disabled.' />'. |
|
$othertitle.'</label></span></td>'. |
|
&Apache::loncommon::end_data_table_row(). |
|
&Apache::loncommon::end_data_table(); |
|
return $output; |
|
} |
|
|
|
sub adhoc_staff { |
|
my ($access,$context,$role,$selectedref,$adhocref,$disabled) = @_; |
|
my $output; |
|
if (ref($adhocref) eq 'HASH') { |
|
my %by_fullname; |
|
my $numinrow = 4; |
|
my $rem; |
|
my @personnel = keys(%{$adhocref}); |
|
if (@personnel) { |
|
foreach my $person (@personnel) { |
|
my ($uname,$udom) = split(/:/,$person); |
|
my $fullname = &Apache::loncommon::plainname($uname,$udom,'lastname'); |
|
$by_fullname{$fullname} = $person; |
|
} |
|
my @sorted = sort(keys(%by_fullname)); |
|
my $count = scalar(@sorted); |
|
$output = &Apache::loncommon::start_data_table(); |
|
for (my $i=0; $i<$count; $i++) { |
|
my $rem = $i%($numinrow); |
|
if ($rem == 0) { |
|
if ($i > 0) { |
|
$output .= &Apache::loncommon::end_data_table_row(); |
|
} |
|
$output .= &Apache::loncommon::start_data_table_row(); |
|
} |
|
my $check; |
|
my $user = $by_fullname{$sorted[$i]}; |
|
if (ref($selectedref) eq 'ARRAY') { |
|
if (grep(/^\Q$user\E$/,@{$selectedref})) { |
|
$check = ' checked="checked"'; |
|
} |
|
} |
|
if ($i == $count-1) { |
|
my $colsleft = $numinrow - $rem; |
|
if ($colsleft > 1) { |
|
$output .= '<td colspan="'.$colsleft.'">'; |
|
} else { |
|
$output .= '<td>'; |
|
} |
|
} else { |
|
$output .= '<td>'; |
|
} |
|
$output .= '<span class="LC_nobreak"><label>'. |
|
'<input type="checkbox" name="'.$context.$role.'_staff_'.$access.'" '. |
|
'value="'.$user.'"'.$check.$disabled.' />'.$sorted[$i]. |
|
'</label></span></td>'; |
|
if ($i == $count-1) { |
|
$output .= &Apache::loncommon::end_data_table_row(); |
|
} |
|
} |
|
$output .= &Apache::loncommon::end_data_table(); |
|
} |
|
} |
|
return $output; |
|
} |
|
|
|
|
1; |
1; |
|
|