--- loncom/interface/lonuserutils.pm 2007/12/05 17:53:13 1.9
+++ loncom/interface/lonuserutils.pm 2007/12/22 00:47:25 1.23
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Utility functions for managing LON-CAPA user accounts
#
-# $Id: lonuserutils.pm,v 1.9 2007/12/05 17:53:13 raeburn Exp $
+# $Id: lonuserutils.pm,v 1.23 2007/12/22 00:47:25 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -46,8 +46,7 @@ sub modifystudent {
# if $csec is undefined, drop the student from all the courses matching
# this one. If $csec is defined, drop them from all other sections of
# this course and add them to section $csec
- my $cdom = $env{'course.'.$courseid.'.domain'};
- my $cnum = $env{'course.'.$courseid.'.num'};
+ my ($cnum,$cdom) = &get_course_identity($courseid);
my %roles = &Apache::lonnet::dump('roles',$udom,$unam);
my ($tmp) = keys(%roles);
# Bail out if we were unable to get the students roles
@@ -69,7 +68,8 @@ sub modifystudent {
my $reply=&Apache::lonnet::modifystudent
# dom name id mode pass f m l g
($udom,$unam,'', '', '',undef,undef,undef,undef,
- $section,time,undef,undef,$desiredhost);
+ $section,time,undef,undef,$desiredhost,'','manual',
+ '',$courseid);
$result .= $reply.':';
}
}
@@ -96,7 +96,7 @@ sub modifyuserrole {
}
} elsif ($context eq 'domain') {
$scope = '/'.$env{'request.role.domain'}.'/';
- } elsif ($context eq 'construction_space') {
+ } elsif ($context eq 'author') {
$scope = '/'.$env{'user.domain'}.'/'.$env{'user.name'};
}
if ($context eq 'domain') {
@@ -127,6 +127,7 @@ sub modifyuserrole {
$email,$role,$start,$end);
if ($userresult eq 'ok') {
if ($role ne '') {
+ $role =~ s/_/\//g;
$roleresult = &Apache::lonnet::assignrole($udom,$uname,$scope,
$role,$end,$start);
}
@@ -136,22 +137,30 @@ sub modifyuserrole {
sub propagate_id_change {
my ($uname,$udom,$user) = @_;
- my (@types,@roles,@cdoms);
+ my (@types,@roles);
@types = ('active','future');
@roles = ('st');
my $idresult;
my %roleshash = &Apache::lonnet::get_my_roles($uname,
- $udom,'userroles',\@types,\@roles,\@cdoms);
+ $udom,'userroles',\@types,\@roles);
+ my %args = (
+ one_time => 1,
+ );
foreach my $item (keys(%roleshash)) {
- my ($cnum,$cdom,$role) = split(/:/,$item);
+ my ($cnum,$cdom,$role) = split(/:/,$item,-1);
my ($start,$end) = split(/:/,$roleshash{$item});
if (&Apache::lonnet::is_course($cdom,$cnum)) {
- my %userupdate;
- my $result = &update_classlist($cdom,$cnum,$udom,$uname,\%userupdate);
+ my $result = &update_classlist($cdom,$cnum,$udom,$uname,$user);
+ my %coursehash =
+ &Apache::lonnet::coursedescription($cdom.'_'.$cnum,\%args);
+ my $cdesc = $coursehash{'description'};
+ if ($cdesc eq '') {
+ $cdesc = $cdom.'_'.$cnum;
+ }
if ($result eq 'ok') {
- $idresult .= "Classlist change: $uname:$udom - class -> $cnum:$cdom\n";
+ $idresult .= &mt('Classlist update for "[_1]" in "[_2]".',$uname.':'.$udom,$cdesc).'
'."\n";
} else {
- $idresult .= "Error - $result -during classlist update for $uname:$udom in $cnum:$cdom\n";
+ $idresult .= &mt('Error: "[_1]" during classlist update for "[_2]" in "[_3]".',$result,$uname.':'.$udom,$cdesc).'
'."\n";
}
}
}
@@ -203,7 +212,7 @@ sub domain_roles_select {
# domain context
#
# Role types
- my @roletypes = ('domain','construction_space','course');
+ my @roletypes = ('domain','author','course');
my %lt = &role_type_names();
#
# build up the menu information to be passed to
@@ -225,11 +234,11 @@ sub domain_roles_select {
my @roles;
if ($roletype eq 'domain') {
@roles = &domain_roles();
- } elsif ($roletype eq 'construction_space') {
+ } elsif ($roletype eq 'author') {
@roles = &construction_space_roles();
} else {
- @roles = &course_roles('domain');
- unshift(@roles,'cr');
+ my $custom = 1;
+ @roles = &course_roles('domain',undef,$custom);
}
my $order = ['Any',@roles];
$select_menus{$roletype}->{'order'} = $order;
@@ -246,7 +255,7 @@ sub domain_roles_select {
}
my $result = &Apache::loncommon::linked_select_forms
('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'},
- 'roletype','showrole',\%select_menus,['domain','construction_space','course']);
+ 'roletype','showrole',\%select_menus,['domain','author','course']);
return $result;
}
@@ -258,7 +267,7 @@ sub hidden_input {
}
sub print_upload_manager_header {
- my ($r,$datatoken,$distotal,$krbdefdom,$context)=@_;
+ my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission)=@_;
my $javascript;
#
if (! exists($env{'form.upfile_associate'})) {
@@ -288,9 +297,14 @@ sub print_upload_manager_header {
$password_choice = 'int';
}
#
+ my $groupslist;
+ if ($context eq 'course') {
+ $groupslist = &get_groupslist();
+ }
my $javascript_validations =
- &javascript_validations('auth',$krbdefdom,$password_choice,undef,
- $env{'request.role.domain'});
+ &javascript_validations('upload',$krbdefdom,$password_choice,undef,
+ $env{'request.role.domain'},$context,
+ $permission,$groupslist);
my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':'');
$r->print(&mt('Total number of records found in file: [_1].',$distotal).
"
\n");
@@ -317,27 +331,52 @@ sub print_upload_manager_header {
###############################################################
###############################################################
sub javascript_validations {
- my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain)=@_;
- my $authheader;
- if ($mode eq 'auth') {
- my %param = ( formname => 'studentform',
- kerb_def_dom => $krbdefdom,
- curr_authtype => $curr_authtype);
- $authheader = &Apache::loncommon::authform_header(%param);
- } elsif ($mode eq 'createcourse') {
- my %param = ( formname => 'ccrs',
- kerb_def_dom => $krbdefdom,
- curr_authtype => $curr_authtype );
- $authheader = &Apache::loncommon::authform_header(%param);
- } elsif ($mode eq 'modifycourse') {
- my %param = ( formname => 'cmod',
+ my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain,
+ $context,$permission,$groupslist)=@_;
+
+ my %param = (
kerb_def_dom => $krbdefdom,
- mode => 'modifycourse',
curr_authtype => $curr_authtype,
- curr_autharg => $curr_authfield );
- $authheader = &Apache::loncommon::authform_header(%param);
+ );
+ if ($mode eq 'createuser') {
+ $param{'formname'} = 'cu';
+ } elsif ($mode eq 'upload') {
+ $param{'formname'} = 'studentform';
+ } elsif ($mode eq 'singlestudent') {
+ $param{'formname'} = 'cu';
+ } elsif ($mode eq 'createcourse') {
+ $param{'formname'} = 'ccrs';
+ } elsif ($mode eq 'modifycourse') {
+ $param{'formname'} = 'cmod';
+ $param{'mode'} = 'modifycourse',
+ $param{'curr_autharg'} = $curr_authfield;
}
+ my ($setsection_call,$setsections_js);
+ my $finish = " vf.submit();\n";
+ if ($mode eq 'upload') {
+ if (($context eq 'course') || ($context eq 'domain')) {
+ if ($context eq 'course') {
+ if ($env{'request.course.sec'} eq '') {
+ $setsection_call = 'setSections(document.'.$param{'formname'}.');';
+ $setsections_js =
+ &setsections_javascript($param{'formname'},$groupslist,
+ $mode);
+ } else {
+ $setsection_call = "'ok'";
+ }
+ } elsif ($context eq 'domain') {
+ $setsection_call = 'setCourse()';
+ $setsections_js = &dc_setcourse_js($param{'formname'},$mode);
+ }
+ $finish = " var checkSec = $setsection_call\n".
+ " if (checkSec == 'ok') {\n".
+ " vf.submit();\n".
+ " }\n";
+ }
+ }
+ my $authheader = &Apache::loncommon::authform_header(%param);
+
my %alert = &Apache::lonlocal::texthash
(username => 'You need to specify the username field.',
authen => 'You must choose an authentication type.',
@@ -351,8 +390,9 @@ sub javascript_validations {
continue => 'Continue adding users?',
);
-# my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition();
my $function_name =(<'.&mt('Settings for assigning roles:').'
'."\n".
&mt('Pick the action to take on roles for these users:').'
';
}
- if ($context eq 'construction_space') {
+ if ($context eq 'author') {
$Str .= ''.&mt('Default role')."
\n".
&mt('Choose the role to assign to users without one specified in the uploaded file');
} elsif ($context eq 'course') {
@@ -712,21 +746,22 @@ sub print_upload_manager_footer {
$Str .= '
'.&mt('Default role and/or section')."
\n".
&mt('Role and/or section for users without one in the uploaded file.');
}
- $Str .= '
';
- my ($options,$cb_script,$coursepick) = &default_role_selector($context,'defaultrole',1);
- if ($context eq 'domain') {
- $Str .= ''.&mt('Domain Level').'
'.$options.'
'.&mt('Course Level').'
'.$cb_script.$coursepick;
- } elsif ($context eq 'construction_space') {
- $Str .= $options;
- } else {
- $Str .= '
';
- }
- if ($context eq 'course') {
- $Str .= "'.&mt('role').': '.
- $options.' '.
- ''.&mt('section').': ".&mt('Full Update')."
\n".
- '
';
+ my $result = &Apache::lonhtmlcommon::start_pick_box()."\n";
+ $result .= &Apache::lonhtmlcommon::row_title(&mt('Starting Date'),
+ 'LC_oddrow_value')."\n".
+ $startform."\n".
+ &Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::row_title(&mt('Ending Date'),
+ 'LC_oddrow_value')."\n".
+ $endform.' '.$perpetual.
+ &Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::end_pick_box();
if ($dateDefault) {
$result .= $dateDefault.'
'."\n";
}
@@ -942,13 +996,13 @@ sub make_dates_default {
my ($startdate,$enddate,$context) = @_;
my $result = '';
if ($context eq 'course') {
- my $dom = $env{'course.'.$env{'request.course.id'}.'.domain'};
- my $crs = $env{'course.'.$env{'request.course.id'}.'.num'};
+ my ($cnum,$cdom) = &get_course_identity();
my $put_result = &Apache::lonnet::put('environment',
{'default_enrollment_start_date'=>$startdate,
- 'default_enrollment_end_date' =>$enddate},$dom,$crs);
+ 'default_enrollment_end_date' =>$enddate},$cdom,$cnum);
if ($put_result eq 'ok') {
- $result .= "Set default start and end dates for course
";
+ $result .= &mt('Set default start and end dates for course').
+ '
'."\n";
#
# Refresh the course environment
&Apache::lonnet::coursedescription($env{'request.course.id'},
@@ -965,7 +1019,7 @@ sub default_role_selector {
my ($context,$checkpriv) = @_;
my %customroles;
my ($options,$coursepick,$cb_jscript);
- if ($context ne 'construction_space') {
+ if ($context ne 'author') {
%customroles = &my_custom_roles();
}
@@ -979,7 +1033,7 @@ sub default_role_selector {
' '."\n";
if ($context eq 'course') {
$options .= &default_course_roles($context,$checkpriv,%customroles);
- } elsif ($context eq 'construction_space') {
+ } elsif ($context eq 'author') {
my @roles = &construction_space_roles($checkpriv);
foreach my $role (@roles) {
my $plrole=&Apache::lonnet::plaintext($role);
@@ -992,33 +1046,36 @@ sub default_role_selector {
$options .= ' ';
}
my $courseform = &Apache::loncommon::selectcourse_link
- ('studentform','defaultcourse','defaultdomain','defaultdesc',"$env{'request.role.domain'}",undef,'Course');
+ ('studentform','dccourse','dcdomain','coursedesc',"$env{'request.role.domain'}",undef,'Course');
$cb_jscript =
- &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'defaultsec','studentform');
+ &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'},'currsec','studentform');
$coursepick = &Apache::loncommon::start_data_table().
&Apache::loncommon::start_data_table_header_row().
''.$courseform.' '.$lt{'rol'}.' '.
''.$lt{'grs'}.' '.
&Apache::loncommon::end_data_table_header_row().
&Apache::loncommon::start_data_table_row()."\n".
- ''."\n".
+ ' '."\n".
' '.
' '.
+ ''.
+ ''.
+ ''.
+ ''.
+ ''.
+ ''.
&Apache::loncommon::end_data_table_row().
- &Apache::loncommon::end_data_table()."\n".
- ''.
- '';
+ &Apache::loncommon::end_data_table()."\n";
}
$options .= '';
return ($options,$cb_jscript,$coursepick);
@@ -1027,17 +1084,21 @@ sub default_role_selector {
sub default_course_roles {
my ($context,$checkpriv,%customroles) = @_;
my $output;
- my @roles = &course_roles($context,$checkpriv);
+ my $custom = 1;
+ my @roles = &course_roles($context,$checkpriv,$custom);
foreach my $role (@roles) {
- my $plrole=&Apache::lonnet::plaintext($role);
- $output .= ' ';
+ if ($role ne 'cr') {
+ my $plrole=&Apache::lonnet::plaintext($role);
+ $output .= ' ';
+ }
}
if (keys(%customroles) > 0) {
- my %customroles = &my_custom_roles();
- foreach my $cust (sort(keys(%customroles))) {
- my $custrole='cr_cr_'.$env{'user.domain'}.
- '_'.$env{'user.name'}.'_'.$cust;
- $output .= ' ';
+ if (grep(/^cr$/,@roles)) {
+ foreach my $cust (sort(keys(%customroles))) {
+ my $custrole='cr_'.$env{'user.domain'}.
+ '_'.$env{'user.name'}.'_'.$cust;
+ $output .= ' ';
+ }
}
}
return $output;
@@ -1045,7 +1106,7 @@ sub default_course_roles {
sub construction_space_roles {
my ($checkpriv) = @_;
- my @allroles = ('ca','aa');
+ my @allroles = &roles_by_context('author');
my @roles;
if ($checkpriv) {
foreach my $role (@allroles) {
@@ -1061,7 +1122,7 @@ sub construction_space_roles {
sub domain_roles {
my ($checkpriv) = @_;
- my @allroles = ('dc','li','dg','au','sc');
+ my @allroles = &roles_by_context('domain');
my @roles;
if ($checkpriv) {
foreach my $role (@allroles) {
@@ -1076,8 +1137,8 @@ sub domain_roles {
}
sub course_roles {
- my ($context,$checkpriv) = @_;
- my @allroles = ('st','ta','ep','in','cc');
+ my ($context,$checkpriv,$custom) = @_;
+ my @allroles = &roles_by_context('course',$custom);
my @roles;
if ($context eq 'domain') {
@roles = @allroles;
@@ -1088,10 +1149,10 @@ sub course_roles {
if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
push(@roles,$role);
} else {
- if ($role ne 'cc' && $env{'request.course.section'} ne '') {
- if (!&Apache::lonnet::allowed('c'.$role,
+ if ($role ne 'cc' && $env{'request.course.sec'} ne '') {
+ if (&Apache::lonnet::allowed('c'.$role,
$env{'request.course.id'}.'/'.
- $env{'request.course.section'})) {
+ $env{'request.course.sec'})) {
push(@roles,$role);
}
}
@@ -1107,17 +1168,18 @@ sub course_roles {
sub curr_role_permissions {
my ($context,$setting,$checkpriv) = @_;
+ my $custom = 1;
my @roles;
- if ($context eq 'construction_space') {
+ if ($context eq 'author') {
@roles = &construction_space_roles($checkpriv);
} elsif ($context eq 'domain') {
if ($setting eq 'course') {
- @roles = &course_roles($context,$checkpriv);
+ @roles = &course_roles($context,$checkpriv,$custom);
} else {
@roles = &domain_roles($checkpriv);
}
} elsif ($context eq 'course') {
- @roles = &course_roles($context,$checkpriv);
+ @roles = &course_roles($context,$checkpriv,$custom);
}
return @roles;
}
@@ -1149,7 +1211,11 @@ sub print_userlist {
($env{'form.Status'});
if ($env{'form.showrole'} eq '') {
- $env{'form.showrole'} = 'Any';
+ if ($context eq 'course') {
+ $env{'form.showrole'} = 'st';
+ } else {
+ $env{'form.showrole'} = 'Any';
+ }
}
if (! defined($env{'form.output'}) ||
$env{'form.output'} !~ /^(csv|excel|html)$/ ) {
@@ -1211,15 +1277,15 @@ sub print_userlist {
if ($role eq $env{'form.showrole'}) {
$roleselected = ' selected="selected" ';
}
- my $plrole=&Apache::lonnet::plaintext($role);
+ my $plrole;
+ if ($role eq 'cr') {
+ $plrole = &mt('Custom role');
+ } else {
+ $plrole=&Apache::lonnet::plaintext($role);
+ }
$role_select .= '';
}
- $roleselected = '';
- if ($env{'form.showrole'} eq 'cr') {
- $roleselected = ' selected="selected" ';
- }
- $role_select .= ''.
- '';
+ $role_select .= '';
$r->print(''.
'
'.
- $lt{'exs'}.' '.
' '.
''.$lt{'new'}.' '.
- '
'.
''.
- '
'.&list_submit_button(&mt('Update Display')). "\n
\n"); + if ($env{'form.coursepick'}) { + $r->print('';
+ my @linkdests = ('aboutme');
+ if ($permission->{'cusr'}) {
+ push (@linkdests,'modify');
+ $output .= ''.$lt{'link'}.': ';
+ my $usernamelink = $env{'form.usernamelink'};
+ if ($usernamelink eq '') {
+ $usernamelink = 'aboutme';
+ }
+ foreach my $item (@linkdests) {
+ my $checkedstr = '';
+ if ($item eq $usernamelink) {
+ $checkedstr = ' checked="checked" ';
+ }
+ $output .= '
';
+ } else {
+ $output .= &mt("Click on a username to view the user's personal page.").'
';
+ }
+ if ($actionselect) {
+ $output .= <<"END";
+$lt{'ac'}: $actionselect
+ +END + } } $output .= "\n
\n". &Apache::loncommon::start_data_table(). @@ -1829,15 +2025,16 @@ END
'.&mt('manual').' | |
'.&Apache::lonhtmlcommon::start_pick_box()."\n"; + if ($mode eq 'upload') { + my ($options,$cb_script,$coursepick) = + &default_role_selector($context,1); + $secbox .= &Apache::lonhtmlcommon::row_title('role','LC_oddrow_value'). + $options. &Apache::lonhtmlcommon::row_closure(1)."\n"; + } + $secbox .= &Apache::lonhtmlcommon::row_title($rowtitle,'LC_oddrow_value')."\n"; + if ($env{'request.course.sec'} eq '') { + $secbox .= '
'.&mt('Existing sections')."\n".
+ ' '.$sections_select.' | '.
+ &mt('New section').' '."\n". + ''."\n". + ''."\n". + ' |
@@ -2252,9 +2793,9 @@ my %lt=&Apache::lonlocal::texthash('usrn
'groups' => "active groups",
);
if ($nosort) {
- $r->print(&Apache::loncommon::start_data_table());
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
$r->print(< \n");
- } elsif ($context eq 'construction_space') {
+ } elsif ($context eq 'author') {
$r->print(' \n");
} else {
$r->print(' \n");
@@ -2648,6 +3196,8 @@ sub upfile_drop_add {
next if ($alerts{'username'}{$domain}{$username});
}
}
+ } else {
+# FIXME check if user info can be updated.
}
if ($id ne '') {
if (!$newuser) {
@@ -2700,7 +3250,7 @@ sub upfile_drop_add {
$r->print(' '.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,users].",$count).' '.&mt('Re-enabling will re-activate data for the role. '.&mt('Dropped [_1] user(s).',$count).' '.&mt('Re-enrollment will re-activate data.')) if ($count);
}
sub classlist_drop {
@@ -2980,7 +3737,7 @@ sub get_groupslist {
$groupslist = join('","',sort(keys(%curr_groups)));
$groupslist = '"'.$groupslist.'"';
}
- return $groupslist;
+ return $groupslist;
}
sub setsections_javascript {
@@ -2991,10 +3748,10 @@ sub setsections_javascript {
$finish = 'formname.submit()';
$roleplace = 3;
} else {
- $checkincluded = 'formname.name == "'.$form.'"';
+ $checkincluded = 'formname.name == "'.$form.'"';
$finish = "seccheck = 'ok';";
$roleplace = 1;
- $setsection_js = "var seccheck = 'alert';";
+ $setsection_js = "var seccheck = 'alert';";
}
my %alerts = &Apache::lonlocal::texthash(
secd => 'Section designations do not apply to Course Coordinator roles.',
@@ -3007,7 +3764,7 @@ sub setsections_javascript {
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.',
- );
+ );
$setsection_js .= <<"ENDSECCODE";
function setSections(formname) {
@@ -3087,8 +3844,355 @@ function setSections(formname) {
$finish
}
ENDSECCODE
- return $setsection_js;
+ return $setsection_js;
+}
+
+sub can_create_user {
+ my ($dom,$context,$usertype) = @_;
+ my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom);
+ my $cancreate = 1;
+ if (ref($domconf{'usercreation'}) eq 'HASH') {
+ if (ref($domconf{'usercreation'}{'cancreate'}) eq 'HASH') {
+ if ($context eq 'course' || $context eq 'author') {
+ my $creation = $domconf{'usercreation'}{'cancreate'}{$context};
+ if ($creation eq 'none') {
+ $cancreate = 0;
+ } elsif ($creation ne 'any') {
+ if (defined($usertype)) {
+ if ($creation ne $usertype) {
+ $cancreate = 0;
+ }
+ }
+ }
+ }
+ }
+ }
+ return $cancreate;
+}
+
+sub can_modify_userinfo {
+ my ($context,$dom,$fields,$userroles) = @_;
+ my %domconfig =
+ &Apache::lonnet::get_dom('configuration',['usermodification'],
+ $dom);
+ my %canmodify;
+ if (ref($fields) eq 'ARRAY') {
+ foreach my $field (@{$fields}) {
+ $canmodify{$field} = 0;
+ if (&Apache::lonnet::allowed('mau',$dom)) {
+ $canmodify{$field} = 1;
+ } else {
+ if (ref($domconfig{'usermodification'}) eq 'HASH') {
+ if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') {
+ if (ref($userroles) eq 'ARRAY') {
+ foreach my $role (@{$userroles}) {
+ my $testrole;
+ if ($role =~ /^cr\//) {
+ $testrole = 'cr';
+ } else {
+ $testrole = $role;
+ }
+ if (ref($domconfig{'usermodification'}{$context}{$testrole}) eq 'HASH') {
+ if ($domconfig{'usermodification'}{$context}{$testrole}{$field}) {
+ $canmodify{$field} = 1;
+ last;
+ }
+ }
+ }
+ } else {
+ foreach my $key (keys(%{$domconfig{'usermodification'}{$context}})) {
+ if (ref($domconfig{'usermodification'}{$context}{$key}) eq 'HASH') {
+ if ($domconfig{'usermodification'}{$context}{$key}{$field}) {
+ $canmodify{$field} = 1;
+ last;
+ }
+ }
+ }
+ }
+ }
+ } elsif ($context eq 'course') {
+ if (ref($userroles) eq 'ARRAY') {
+ if (grep(/^st$/,@{$userroles})) {
+ $canmodify{$field} = 1;
+ }
+ } else {
+ $canmodify{$field} = 1;
+ }
+ }
+ }
+ }
+ }
+ return %canmodify;
+}
+
+sub check_usertype {
+ my ($dom,$uname,$rules) = @_;
+ my $usertype;
+ if (ref($rules) eq 'HASH') {
+ my @user_rules = keys(%{$rules});
+ if (@user_rules > 0) {
+ my %rule_check = &Apache::lonnet::inst_rulecheck($dom,$uname,undef,'username',\@user_rules);
+ if (keys(%rule_check) > 0) {
+ $usertype = 'unofficial';
+ foreach my $item (keys(%rule_check)) {
+ if ($rule_check{$item}) {
+ $usertype = 'official';
+ last;
+ }
+ }
+ }
+ }
+ }
+ return $usertype;
+}
+
+sub roles_by_context {
+ my ($context,$custom) = @_;
+ my @allroles;
+ if ($context eq 'course') {
+ @allroles = ('st','ad','ta','ep','in','cc');
+ if ($custom) {
+ push(@allroles,'cr');
+ }
+ } elsif ($context eq 'author') {
+ @allroles = ('ca','aa');
+ } elsif ($context eq 'domain') {
+ @allroles = ('li','dg','sc','au','dc');
+ }
+ return @allroles;
}
+sub get_permission {
+ my ($context,$roles) = @_;
+ my %permission;
+ if ($context eq 'course') {
+ my $custom = 1;
+ my @allroles = &roles_by_context($context,$custom);
+ foreach my $role (@allroles) {
+ if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) {
+ $permission{'cusr'} = 1;
+ last;
+ }
+ }
+ if (&Apache::lonnet::allowed('ccr',$env{'request.course.id'})) {
+ $permission{'custom'} = 1;
+ }
+ if (&Apache::lonnet::allowed('vcl',$env{'request.course.id'})) {
+ $permission{'view'} = 1;
+ }
+ if (!$permission{'view'}) {
+ my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'};
+ $permission{'view'} = &Apache::lonnet::allowed('vcl',$scope);
+ if ($permission{'view'}) {
+ $permission{'view_section'} = $env{'request.course.sec'};
+ }
+ }
+ if (!$permission{'cusr'}) {
+ if ($env{'request.course.sec'} ne '') {
+ my $scope = $env{'request.course.id'}.'/'.$env{'request.course.sec'};
+ $permission{'cusr'} = (&Apache::lonnet::allowed('cst',$scope));
+ if ($permission{'cusr'}) {
+ $permission{'cusr_section'} = $env{'request.course.sec'};
+ }
+ }
+ }
+ if (&Apache::lonnet::allowed('mdg',$env{'request.course.id'})) {
+ $permission{'grp_manage'} = 1;
+ }
+ } elsif ($context eq 'author') {
+ $permission{'cusr'} = &authorpriv($env{'user.name'},$env{'request.role.domain'});
+ $permission{'view'} = $permission{'cusr'};
+ } else {
+ my @allroles = &roles_by_context($context);
+ foreach my $role (@allroles) {
+ if (&Apache::lonnet::allowed('c'.$role,$env{'request.role.domain'})) { $permission{'cusr'} = 1;
+ last;
+ }
+ }
+ if (!$permission{'cusr'}) {
+ if (&Apache::lonnet::allowed('mau',$env{'request.role.domain'})) {
+ $permission{'cusr'} = 1;
+ }
+ }
+ if (&Apache::lonnet::allowed('ccr',$env{'request.role.domain'})) {
+ $permission{'custom'} = 1;
+ }
+ $permission{'view'} = $permission{'cusr'};
+ }
+ my $allowed = 0;
+ foreach my $perm (values(%permission)) {
+ if ($perm) { $allowed=1; last; }
+ }
+ return (\%permission,$allowed);
+}
+
+# ==================================================== Figure out author access
+
+sub authorpriv {
+ my ($auname,$audom)=@_;
+ unless ((&Apache::lonnet::allowed('cca',$audom.'/'.$auname))
+ || (&Apache::lonnet::allowed('caa',$audom.'/'.$auname))) { return ''; } return 1;
+}
+
+sub get_course_identity {
+ my ($cid) = @_;
+ my ($cnum,$cdom,$cdesc);
+ if ($cid eq '') {
+ $cid = $env{'request.course.id'}
+ }
+ if ($cid ne '') {
+ $cnum = $env{'course.'.$cid.'.num'};
+ $cdom = $env{'course.'.$cid.'.domain'};
+ $cdesc = $env{'course.'.$cid.'.description'};
+ if ($cnum eq '' || $cdom eq '') {
+ my %coursehash =
+ &Apache::lonnet::coursedescription($cid,{'one_time' => 1});
+ $cdom = $coursehash{'domain'};
+ $cnum = $coursehash{'num'};
+ $cdesc = $coursehash{'description'};
+ }
+ }
+ return ($cnum,$cdom,$cdesc);
+}
+
+sub dc_setcourse_js {
+ my ($formname,$mode) = @_;
+ my $dc_setcourse_code;
+ my $cctext = &Apache::lonnet::plaintext('cc');
+ my %alerts = §ioncheck_alerts();
+ my $role = 'role';
+ if ($mode eq 'upload') {
+ $role = 'courserole';
+ }
+ $dc_setcourse_code = (<<"SCRIPTTOP");
+function setCourse() {
+ var course = document.$formname.dccourse.value;
+ if (course != "") {
+ if (document.$formname.dcdomain.value != document.$formname.origdom.value) {
+ alert("$alerts{'curd'}");
+ return;
+ }
+ var userrole = document.$formname.$role.options[document.$formname.$role.selectedIndex].value
+ var section="";
+ var numsections = 0;
+ var newsecs = new Array();
+ for (var i=0; i
$lt{'usrn'}
$lt{'dom'}
@@ -2264,32 +2805,32 @@ my %lt=&Apache::lonlocal::texthash('usrn
$lt{'start'}
$lt{'end'}
$lt{'groups'}
-
END
-
+ $r->print(&Apache::loncommon::end_data_table_header_row());
} else {
- $r->print(&Apache::loncommon::start_data_table());
+ $r->print(&Apache::loncommon::start_data_table().
+ &Apache::loncommon::start_data_table_header_row());
$r->print(<
+
- $lt{'usrn'}
+ $lt{'usrn'}
- $lt{'dom'}
+ $lt{'dom'}
- ID
+ ID
- $lt{'sn'}
+ $lt{'sn'}
- $lt{'sec'}
+ $lt{'sec'}
- $lt{'start'}
+ $lt{'start'}
- $lt{'end'}
+ $lt{'end'}
- $lt{'groups'}
+ $lt{'groups'}
-
END
+ $r->print(&Apache::loncommon::end_data_table_header_row());
}
#
# Sort the students
@@ -2336,6 +2877,13 @@ END
}
my $status = $sdata->[$index{'status'}];
next if ($status ne 'Active');
+ if ($env{'request.course.sec'} ne '') {
+ if ($section ne $env{'request.course.sec'}) {
+ next;
+ }
+ }
+ my $studentkey = $student.':'.$section;
+ my $startitem = '';
#
$r->print(&Apache::loncommon::start_data_table_row());
$r->print(<<"END");
@@ -2395,7 +2943,7 @@ sub print_first_users_upload_form {
# ================================================= Drop/Add from uploaded file
sub upfile_drop_add {
- my ($r,$context) = @_;
+ my ($r,$context,$permission) = @_;
&Apache::loncommon::load_tmp_file($r);
my @userdata=&Apache::loncommon::upfile_record_sep();
if($env{'form.noFirstLine'}){shift(@userdata);}
@@ -2485,7 +3033,7 @@ sub upfile_drop_add {
} elsif ($setting eq 'course') {
$defaultrole = $env{'form.courserole'};
}
- } elsif ($context eq 'construction_space') {
+ } elsif ($context eq 'author') {
$defaultrole = $env{'form.defaultrole'};
}
if ($context eq 'domain' && $setting eq 'course') {
@@ -2508,7 +3056,7 @@ sub upfile_drop_add {
#######################################
if ($context eq 'course') {
$r->print(''.&mt('Enrolling Users')."
\n'.&mt('Updating Co-authors')."
\n'.&mt('Adding/Modifying Users')."
\n
'.
&mt('[_1]: Unable to enroll. No password specified.',$username)
);
- } elsif ($context eq 'construction_space') {
+ } elsif ($context eq 'author') {
$r->print('
'.
&mt('[_1]: Unable to add co-author. No password specified.',$username)
);
@@ -2726,39 +3276,7 @@ sub upfile_drop_add {
&mt('Authentication changed for [_1] existing users.',
$counts{'auth'})."".&mt("Expire Users' Roles")."
");
+sub print_drop_menu {
+ my ($r,$context,$permission) = @_;
+ $r->print(''.&mt("Drop Students").'
'."\n".
+ ''. &Apache::loncommon::end_page());
return;
}
-
# ================================================================== Phase four
-sub expire_user_list {
- my ($r,$context) = @_;
+sub update_user_list {
+ my ($r,$context,$setting,$choice) = @_;
+ my $now = time;
my $count=0;
- my @droplist = &Apache::loncommon::get_env_multiple('form.droplist');
- foreach (@droplist) {
- my ($uname,$udom)=split(/\:/,$_);
- # drop student
- my $result = &modifystudent($udom,$uname,$env{'request.course.id'});
+ my @changelist;
+ if ($choice ne '') {
+ @changelist = &Apache::loncommon::get_env_multiple('form.actionlist');
+ } else {
+ @changelist = &Apache::loncommon::get_env_multiple('form.droplist');
+ }
+ my %result_text = ( ok => { 'revoke' => 'Revoked',
+ 'delete' => 'Deleted',
+ 'reenable' => 'Re-enabled',
+ 'activate' => 'Activated',
+ 'chgdates' => 'Changed Access Dates for',
+ 'chgsec' => 'Changed section for',
+ 'drop' => 'Dropped',
+ },
+ error => {'revoke' => 'revoking',
+ 'delete' => 'deleting',
+ 'reenable' => 're-enabling',
+ 'activate' => 'activating',
+ 'chgdates' => 'changing access dates for',
+ 'chgsec' => 'changing section for',
+ 'drop' => 'dropping',
+ },
+ );
+ my ($startdate,$enddate);
+ if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') {
+ ($startdate,$enddate) = &get_dates_from_form();
+ }
+ foreach my $item (@changelist) {
+ my ($role,$uname,$udom,$cid,$sec,$scope,$result,$type,$locktype,@sections,
+ $scopestem);
+ if ($choice eq 'drop') {
+ ($uname,$udom,$sec) = split(/:/,$item,-1);
+ $role = 'st';
+ $cid = $env{'request.course.id'};
+ $scopestem = '/'.$cid;
+ $scopestem =~s/\_/\//g;
+ if ($sec eq '') {
+ $scope = $scopestem;
+ } else {
+ $scope = $scopestem.'/'.$sec;
+ }
+ } elsif ($context eq 'course') {
+ ($uname,$udom,$role,$sec,$type,$locktype) = split(/\:/,$item,-1);
+ $cid = $env{'request.course.id'};
+ $scopestem = '/'.$cid;
+ $scopestem =~s/\_/\//g;
+ if ($sec eq '') {
+ $scope = $scopestem;
+ } else {
+ $scope = $scopestem.'/'.$sec;
+ }
+ } elsif ($context eq 'author') {
+ ($uname,$udom,$role) = split(/\:/,$item,-1);
+ $scope = '/'.$env{'user.domain'}.'/'.$env{'user.name'};
+ } elsif ($context eq 'domain') {
+ if ($setting eq 'domain') {
+ ($role,$uname,$udom) = split(/\:/,$item,-1);
+ $scope = '/'.$env{'request.role.domain'}.'/';
+ } elsif ($setting eq 'author') {
+ ($uname,$udom,$role,$scope) = split(/\:/,$item);
+ } elsif ($setting eq 'course') {
+ ($uname,$udom,$role,$cid,$sec,$type,$locktype) =
+ split(/\:/,$item);
+ $scope = '/'.$cid;
+ $scope =~s/\_/\//g;
+ if ($sec ne '') {
+ $scope .= '/'.$sec;
+ }
+ }
+ }
+ my $plrole = &Apache::lonnet::plaintext($role);
+ my ($uid,$first,$middle,$last,$gene,$sec);
+ my $start = $env{'form.'.$item.'_start'};
+ my $end = $env{'form.'.$item.'_end'};
+ if ($choice eq 'drop') {
+ # drop students
+ $end = $now;
+ $type = 'manual';
+ $result =
+ &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+ } elsif ($choice eq 'revoke') {
+ # revoke or delete user role
+ $end = $now;
+ if ($role eq 'st') {
+ $result =
+ &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+ } else {
+ $result =
+ &Apache::lonnet::revokerole($udom,$uname,$scope,$role);
+ }
+ } elsif ($choice eq 'delete') {
+ $start = -1;
+ $end = -1;
+ if ($role eq 'st') {
+# FIXME - how does role deletion affect classlist?
+ &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+ } else {
+ $result =
+ &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$now,
+ 0,1);
+ }
+ } else {
+ #reenable, activate, change access dates or change section
+ if ($choice ne 'chgsec') {
+ $start = $startdate;
+ $end = $enddate;
+ }
+ if ($choice eq 'reenable') {
+ if ($role eq 'st') {
+ $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+ } else {
+ $result =
+ &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
+ $now);
+ }
+ } elsif ($choice eq 'activate') {
+ if ($role eq 'st') {
+ $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+ } else {
+ $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
+ $now);
+ }
+ } elsif ($choice eq 'chgdates') {
+ if ($role eq 'st') {
+ $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$sec,$end,$start,$type,$locktype,$cid);
+ } else {
+ $result = &Apache::lonnet::assignrole($udom,$uname,$scope,$role,$end,
+ $start);
+ }
+ } elsif ($choice eq 'chgsec') {
+ my (@newsecs,$revresult,$nochg,@retained);
+ if ($role ne 'cc') {
+ @newsecs = split(/,/,$env{'form.newsecs'});
+ }
+ # remove existing section if not to be retained.
+ if (!$env{'form.retainsec'}) {
+ if ($sec eq '') {
+ if (@newsecs == 0) {
+ $result = &mt('No change in section assignment (none)');
+ $nochg = 1;
+ }
+ } else {
+ if (!grep(/^\Q$sec\E$/,@newsecs)) {
+ $revresult =
+ &Apache::lonnet::revokerole($udom,$uname,$scope,$role);
+ } else {
+ push(@retained,$sec);
+ }
+ }
+ } else {
+ push(@retained,$sec);
+ }
+ # add new sections
+ if (@newsecs == 0) {
+ if (!$nochg) {
+ if ($sec ne '') {
+ if ($role eq 'st') {
+ $result =
+ &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,undef,$end,$start,$type,$locktype,$cid);
+ } else {
+ my $newscope = $scopestem;
+ $result = &Apache::lonnet::assignrole($udom,$uname,$newscope,$role,$end,$start);
+ }
+ }
+ }
+ } else {
+ foreach my $newsec (@newsecs) {
+ if (!grep(/^\Q$newsec\E$/,@retained)) {
+ if ($role eq 'st') {
+ $result = &Apache::lonnet::modify_student_enrollment($udom,$uname,undef,undef,undef,undef,undef,$newsec,$end,$start,$type,$locktype,$cid);
+ } else {
+ my $newscope = $scopestem;
+ if ($newsec ne '') {
+ $newscope .= '/'.$newsec;
+ }
+ $result = &Apache::lonnet::assignrole($udom,$uname,
+ $newscope,$role,$end,$start);
+ }
+ }
+ }
+ }
+ }
+ }
+ my $extent = $scope;
+ if ($choice eq 'drop' || $context eq 'course') {
+ my ($cnum,$cdom,$cdesc) = &get_course_identity($cid);
+ if ($cdesc) {
+ $extent = $cdesc;
+ }
+ }
if ($result eq 'ok' || $result eq 'ok:') {
- $r->print(&mt('Dropped [_1]',$uname.'@'.$udom).'
');
+ $r->print(&mt("$result_text{'ok'}{$choice} role of '[_1]' in [_2] for [_3]",
+ $plrole,$extent,$uname.':'.$udom).'
');
$count++;
} else {
$r->print(
- &mt('Error dropping [_1]:[_2]',$uname.'@'.$udom,$result).
- '
');
+ &mt("Error $result_text{'error'}{$choice} [_1] in [_2] for [_3]:[_4]",
+ $plrole,$extent,$uname.':'.$udom,$result).'
');
+ }
+ }
+ $r->print('