--- loncom/interface/lonuserutils.pm 2007/12/05 17:53:13 1.9 +++ loncom/interface/lonuserutils.pm 2007/12/22 00:39:52 1.22 @@ -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.22 2007/12/22 00:39:52 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 =(< $formname, + my %param = ( formname => $form, kerb_def_dom => $krbdefdom, kerb_def_auth => $krbdef ); @@ -670,8 +704,8 @@ sub print_upload_manager_footer { my $krbform = &Apache::loncommon::authform_kerberos(%param); my $intform = &Apache::loncommon::authform_internal(%param); my $locform = &Apache::loncommon::authform_local(%param); - my $date_table = &date_setting_table(undef,undef,$context); - + my $date_table = &date_setting_table(undef,undef,$context,undef, + $formname,$permission); my $Str = "\n".'
'; $Str .= &hidden_input('nfields',$i); $Str .= &hidden_input('keyfields',$keyfields); @@ -702,7 +736,7 @@ sub print_upload_manager_footer { $Str .= '

'.&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 .= '
'.&mt('role').': '. - $options.' '. - ''.&mt('section').': 
'; - } - if ($context eq 'course') { - $Str .= "

".&mt('Full Update')."

\n". - '
'); &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear, - $context); + $context,$permission); } sub setup_date_selectors { - my ($starttime,$endtime,$mode) = @_; + my ($starttime,$endtime,$mode,$nolink,$formname) = @_; + if ($formname eq '') { + $formname = 'studentform'; + } if (! defined($starttime)) { $starttime = time; unless ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { @@ -867,12 +906,15 @@ sub setup_date_selectors { } } } - my $startdateform = &Apache::lonhtmlcommon::date_setter('studentform', - 'startdate', - $starttime); - my $enddateform = &Apache::lonhtmlcommon::date_setter('studentform', - 'enddate', - $endtime); + + my $startdateform = + &Apache::lonhtmlcommon::date_setter($formname,'startdate',$starttime, + undef,undef,undef,undef,undef,undef,undef,$nolink); + + my $enddateform = + &Apache::lonhtmlcommon::date_setter($formname,'enddate',$endtime, + undef,undef,undef,undef,undef,undef,undef,$nolink); + if ($mode eq 'create_enrolldates') { $startdateform = &Apache::lonhtmlcommon::date_setter('ccrs', 'startenroll', @@ -903,35 +945,47 @@ sub get_dates_from_form { } sub date_setting_table { - my ($starttime,$endtime,$mode) = @_; - my ($startform,$endform)=&setup_date_selectors($starttime,$endtime,$mode); + my ($starttime,$endtime,$mode,$bulkaction,$formname,$permission) = @_; + my $nolink; + if ($bulkaction) { + $nolink = 1; + } + my ($startform,$endform) = + &setup_date_selectors($starttime,$endtime,$mode,$nolink,$formname); my $dateDefault; if ($mode eq 'create_enrolldates' || $mode eq 'create_defaultdates') { $dateDefault = ' '; - } elsif ($mode ne 'construction_space' && $mode ne 'domain') { - $dateDefault = ''. - ''; + } elsif ($mode ne 'author' && $mode ne 'domain') { + if (($bulkaction eq 'reenable') || + ($bulkaction eq 'activate') || + ($bulkaction eq 'chgdates') || + ($env{'form.action'} eq 'upload')) { + if ($env{'request.course.sec'} eq '') { + $dateDefault = ''. + ''; + } + } } - my $perpetual = ''; + $perpetual.= ' /> '.&mt('no ending date').''; if ($mode eq 'create_enrolldates') { $perpetual = ' '; } - my $result = &Apache::lonhtmlcommon::start_pick_box()."\n". - &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().'
'; + 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". ''. ''. ''. ''. ''. - '
'. - $lt{'exs'}.'
'. '
  '.$lt{'new'}.'
'. ''. - '
'. + ''. + ''. + ''. + ''. + ''. + ''. &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(''); } if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) { @@ -1240,15 +1306,21 @@ sub print_userlist { &Apache::lonhtmlcommon::end_pick_box().'

'. '

'.&list_submit_button(&mt('Update Display')). "\n

\n"); + if ($env{'form.coursepick'}) { + $r->print('
'.&mt('Searching').' ...
 
'); + } + } else { + $r->print('
'.&mt('Searching').' ...
 
'); } - $r->print('
'.&mt('Searching').' ...
 
'); $r->rflush(); if ($context eq 'course') { my $classlist = &Apache::loncoursedata::get_classlist(); my $secidx = &Apache::loncoursedata::CL_SECTION(); + my $viewablesec = &viewable_section($permission); foreach my $student (keys(%{$classlist})) { - if (exists($permission->{'view_section'})) { - if ($classlist->{$student}[$secidx] ne $permission->{'view_section'}) { + my $section = $classlist->{$student}[$secidx]; + if ($viewablesec ne '') { + if ($section ne $viewablesec) { next; } else { $userlist{$student} = $classlist->{$student}; @@ -1257,61 +1329,61 @@ sub print_userlist { $userlist{$student} = $classlist->{$student}; } } - my $cid =$env{'request.course.id'}; - my $cdom=$env{'course.'.$cid.'.domain'}; - my $cnum=$env{'course.'.$cid.'.num'}; + my $cid = $env{'request.course.id'}; + my ($cnum,$cdom) = &get_course_identity($cid); my $showroles; if ($env{'form.showrole'} ne 'Any') { $showroles = [$env{'form.showrole'}]; } else { $showroles = undef; } + my $withsec = 1; my %advrolehash = &Apache::lonnet::get_my_roles($cnum,$cdom,undef, - \@statuses,$showroles); + \@statuses,$showroles,undef,$withsec); &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo, - \%advrolehash); + \%advrolehash,$permission); } else { my (%cstr_roles,%dom_roles); - if ($context eq 'construction_space') { + if ($context eq 'author') { # List co-authors and assistant co-authors - my @possroles = ('ca','aa'); + my @possroles = &roles_by_context($context); %cstr_roles = &Apache::lonnet::get_my_roles(undef,undef,undef, \@statuses,\@possroles); &gather_userinfo($context,$format,\%userlist,$indexhash,\%userinfo, - \%cstr_roles); + \%cstr_roles,$permission); } elsif ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'}); foreach my $key (keys(%dom_roles)) { if (ref($dom_roles{$key}) eq 'HASH') { &gather_userinfo($context,$format,\%userlist,$indexhash, - \%userinfo,$dom_roles{$key}); + \%userinfo,$dom_roles{$key},$permission); } } - } elsif ($env{'form.roletype'} eq 'construction_space') { + } elsif ($env{'form.roletype'} eq 'author') { my %dom_roles = &Apache::lonnet::get_domain_roles($env{'request.role.domain'},['au']); my %coauthors; foreach my $key (keys(%dom_roles)) { if (ref($dom_roles{$key}) eq 'HASH') { if ($env{'form.showrole'} eq 'au') { &gather_userinfo($context,$format,\%userlist,$indexhash, - \%userinfo,$dom_roles{$key}); + \%userinfo,$dom_roles{$key},$permission); } else { my @possroles; if ($env{'form.showrole'} eq 'Any') { - @possroles = ('ca','aa'); + @possroles = &roles_by_context('author'); } else { @possroles = ($env{'form.showrole'}); } foreach my $author (sort(keys(%{$dom_roles{$key}}))) { - my ($role,$authorname,$authordom) = split(/:/,$author); + my ($role,$authorname,$authordom) = split(/:/,$author,-1); my $extent = '/'.$authordom.'/'.$authorname; %{$coauthors{$extent}} = &Apache::lonnet::get_my_roles($authorname, $authordom,undef,\@statuses,\@possroles); } &gather_userinfo($context,$format,\%userlist, - $indexhash,\%userinfo,\%coauthors); + $indexhash,\%userinfo,\%coauthors,$permission); } } } @@ -1320,16 +1392,13 @@ sub print_userlist { my %courses = &process_coursepick(); my %allusers; foreach my $cid (keys(%courses)) { - my %coursehash = - &Apache::lonnet::coursedescription($cid,{'one_time' => 1}); - my $cdom = $coursehash{'domain'}; - my $cnum = $coursehash{'num'}; - my $cdesc = $coursehash{'description'}; + my ($cnum,$cdom,$cdesc) = &get_course_identity($cid); + next if ($cnum eq '' || $cdom eq ''); + my $custom = 1; my (@roles,@sections,%access,%users,%userdata, %statushash); if ($env{'form.showrole'} eq 'Any') { - @roles = &course_roles($context); - unshift(@roles,'cr'); + @roles = &course_roles($context,undef,$custom); } else { @roles = ($env{'form.showrole'}); } @@ -1356,20 +1425,22 @@ sub print_userlist { } } &gather_userinfo($context,$format,\%userlist,$indexhash, - \%userinfo,\%allusers); + \%userinfo,\%allusers,$permission); } else { + $r->print(''); return; } } } } if (keys(%userlist) == 0) { - if ($context eq 'construction_space') { + if ($context eq 'author') { $r->print(&mt('There are no co-authors to display.')."\n"); } elsif ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { $r->print(&mt('There are no users with domain roles to display.')."\n"); - } elsif ($env{'form.roletype'} eq 'construction_space') { + } elsif ($env{'form.roletype'} eq 'author') { $r->print(&mt('There are no authors or co-authors to display.')."\n"); } elsif ($env{'form.roletype'} eq 'course') { $r->print(&mt('There are no course users to display')."\n"); @@ -1381,41 +1452,50 @@ sub print_userlist { # Print out the available choices my $usercount; if ($env{'form.action'} eq 'modifystudent') { - ($usercount) = &show_users_list($r,$context,'view','modify', + ($usercount) = &show_users_list($r,$context,'view',$permission, $env{'form.Status'},\%userlist,$keylist); } else { ($usercount) = &show_users_list($r,$context,$env{'form.output'}, - 'aboutme',$env{'form.Status'},\%userlist,$keylist); + $permission,$env{'form.Status'},\%userlist,$keylist); } if (!$usercount) { $r->print('
'.&mt('There are no users matching the search criteria.')); } } - $r->print(''); + $r->print(''); } sub list_submit_button { my ($text) = @_; - return ''; + return ''; } sub gather_userinfo { - my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash) = @_; + my ($context,$format,$userlist,$indexhash,$userinfo,$rolehash,$permission) = @_; foreach my $item (keys(%{$rolehash})) { - @{$userlist->{$item}} = (); my %userdata; - if ($context eq 'construction_space' || $context eq 'course') { + if ($context eq 'author') { ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) = split(/:/,$item); ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item}); &build_user_record(\%userdata,$userinfo,$indexhash,$item,$userlist); + } elsif ($context eq 'course') { + my $viewablesec = &viewable_section($permission); + ($userdata{'username'},$userdata{'domain'},$userdata{'role'}, + $userdata{'section'}) = split(/:/,$item,-1); + ($userdata{'start'},$userdata{'end'})=split(/:/,$rolehash->{$item}); + if (($viewablesec ne '') && ($userdata{'section'} ne '')) { + next if ($viewablesec ne $userdata{'section'}); + } + &build_user_record(\%userdata,$userinfo,$indexhash,$item,$userlist); } elsif ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { ($userdata{'role'},$userdata{'username'},$userdata{'domain'}) = split(/:/,$item); ($userdata{'end'},$userdata{'start'})=split(/:/,$rolehash->{$item}); &build_user_record(\%userdata,$userinfo,$indexhash,$item,$userlist); - } elsif ($env{'form.roletype'} eq 'construction_space') { + } elsif ($env{'form.roletype'} eq 'author') { if (ref($rolehash->{$item}) eq 'HASH') { $userdata{'extent'} = $item; foreach my $key (keys(%{$rolehash->{$item}})) { @@ -1430,6 +1510,7 @@ sub gather_userinfo { ($userdata{'username'},$userdata{'domain'},$userdata{'role'}) = split(/:/,$item); if (ref($rolehash->{$item}) eq 'HASH') { + my $numcids = keys(%{$rolehash->{$item}}); foreach my $cid (sort(keys(%{$rolehash->{$item}}))) { if (ref($rolehash->{$item}{$cid}) eq 'HASH') { my $spanstart = ''; @@ -1437,6 +1518,13 @@ sub gather_userinfo { my $space = ', '; if ($format eq 'html' || $format eq 'view') { $spanstart = ''; + if ($permission->{'cusr'}) { + if ($numcids > 1) { + $spanstart .= ''; + } else { + $spanstart .= ''; + } + } $spanend = '
'; $space = ', '; } @@ -1459,6 +1547,7 @@ sub gather_userinfo { sub build_user_record { my ($userdata,$userinfo,$indexhash,$record_key,$userlist) = @_; + next if ($userdata->{'start'} eq '-1' && $userdata->{'end'} eq '-1'); &process_date_info($userdata); my $username = $userdata->{'username'}; my $domain = $userdata->{'domain'}; @@ -1696,7 +1785,7 @@ sub process_date_info { } sub show_users_list { - my ($r,$context,$mode,$linkto,$statusmode,$userlist,$keylist)=@_; + my ($r,$context,$mode,$permission,$statusmode,$userlist,$keylist)=@_; # # Variables for excel output my ($excel_workbook, $excel_sheet, $excel_filename,$row,$format); @@ -1714,23 +1803,26 @@ sub show_users_list { if (!grep(/^\Q$sortby\E$/,@sortable)) { $sortby = 'username'; } + my $setting = $env{'form.roletype'}; my ($cid,$cdom,$cnum,$classgroups,$displayphotos,$displayclickers); if ($context eq 'course') { - $cid=$env{'request.course.id'}; - $cdom = $env{'course.'.$cid.'.domain'}; - $cnum = $env{'course.'.$cid.'.num'}; + $cid = $env{'request.course.id'}; + ($cnum,$cdom) = &get_course_identity($cid); ($classgroups) = &Apache::loncoursedata::get_group_memberships( $userlist,$keylist,$cdom,$cnum); - if (! exists($env{'form.displayphotos'})) { - $env{'form.displayphotos'} = 'off'; - } - $displayphotos = $env{'form.displayphotos'}; - if (! exists($env{'form.displayclickers'})) { - $env{'form.displayclickers'} = 'off'; - } - $displayclickers = $env{'form.displayclickers'}; - if ($env{'course.'.$cid.'.internal.showphoto'}) { - $r->print(' + if ($mode eq 'autoenroll') { + $env{'form.showrole'} = 'st'; + } else { + if (! exists($env{'form.displayphotos'})) { + $env{'form.displayphotos'} = 'off'; + } + $displayphotos = $env{'form.displayphotos'}; + if (! exists($env{'form.displayclickers'})) { + $env{'form.displayclickers'} = 'off'; + } + $displayclickers = $env{'form.displayclickers'}; + if ($env{'course.'.$cid.'.internal.showphoto'}) { + $r->print(' - '); - } - $r->print(<print(< END + } } - unless ($mode eq 'autoenroll') { + if ($mode ne 'autoenroll') { + my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript(); + my $alert = &mt("You must select at least one user by checking a user's 'Select' checkbox"); + my $singconfirm = &mt(' for a single user'); + my $multconfirm = &mt(' for multiple users'); + my $date_sec_selector = &date_section_javascript($context,$setting,$statusmode); $r->print(< +$check_uncheck_js + +function verify_action (field) { + var numchecked = 0; + var singconf = '$singconfirm'; + var multconf = '$multconfirm'; + if (field.length > 0) { + for (i = 0; i < field.length; i++) { + if (field[i].checked == true) { + numchecked ++; + } + } + } else { + if (field.checked == true) { + numchecked ++; + } + } + if (numchecked == 0) { + alert("$alert"); + } + else { + var message = document.studentform.bulkaction[document.studentform.bulkaction.selectedIndex].text; + if (numchecked == 1) { + message += singconf; + } + else { + message += multconf; + } + if (confirm(message)) { + document.studentform.phase.value = 'bulkchange'; + document.studentform.submit(); + } + } +} + +function username_display_launch(username,domain) { + var target; + for (var i=0; i +$date_sec_selector END } @@ -1772,10 +1927,17 @@ END 'clicker' => "clicker id", 'photo' => "photo", 'extent' => "extent", + 'pr' => "Proceed", + 'ca' => "check all", + 'ua' => "uncheck all", + 'ac' => "Action to take for selected users", + 'link' => "Behavior of username links", + 'aboutme' => "Display a user's personal page", + 'modify' => "Modify a user's information", ); if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { $lt{'extent'} = &mt('Course(s): description, section(s), status'); - } elsif ($context eq 'construction_space') { + } elsif ($context eq 'author') { $lt{'extent'} = &mt('Author'); } my @cols = ('username','domain','id','fullname'); @@ -1788,7 +1950,7 @@ END if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') { push(@cols,'role'); } - if ($context eq 'domain' && ($env{'form.roletype'} eq 'construction_space' || + if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' || $env{'form.roletype'} eq 'course')) { push (@cols,'extent'); } @@ -1807,19 +1969,52 @@ END } elsif ($env{'form.showrole'} ne 'Any') { $rolefilter = &Apache::lonnet::plaintext($env{'form.showrole'}); } - my $results_description = &results_header_row($rolefilter,$statusmode, - $context); - $r->print(''.$results_description.'
'); - my $output; - if ($mode eq 'html' || $mode eq 'view') { - $r->print(< - + my $results_description; + if ($mode ne 'autoenroll') { + $results_description = &results_header_row($rolefilter,$statusmode, + $context,$permission); + $r->print(''.$results_description.'
'); + } + my ($output,$actionselect); + if ($mode eq 'html' || $mode eq 'view' || $mode eq 'autoenroll') { + if ($mode ne 'autoenroll') { + if ($permission->{'cusr'}) { + $actionselect = &select_actions($context,$setting,$statusmode); + } + $r->print(< + + + + +END + $output = '

'; + 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 .= '  '; + } + $output .= '
'; + } else { + $output .= &mt("Click on a username to view the user's personal page.").'
'; + } + if ($actionselect) { + $output .= <<"END"; +$lt{'ac'}: $actionselect

+

  + END - if ($linkto eq 'aboutme') { - $output = &mt("Select a user name to view the user's personal page."); - } elsif ($linkto eq 'modify') { - $output = &mt("Select a user name to modify the user's information"); + } } $output .= "\n

\n". &Apache::loncommon::start_data_table(). @@ -1829,15 +2024,16 @@ END $lt{'type'} "; } else { - $output .= " -Count - "; + $output .= "\n".''.&mt('Count').''."\n"; + if ($actionselect) { + $output .= ''.&mt('Select').''."\n"; + } } foreach my $item (@cols) { $output .= "$lt{$item}\n"; } my %role_types = &role_type_names(); - if ($context eq 'course') { + if ($context eq 'course' && $mode ne 'autoenroll') { if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { # Clicker display on or off? my %clicker_options = &Apache::lonlocal::texthash( @@ -1871,8 +2067,8 @@ END ' '."\n"; } } - $output .= &Apache::loncommon::end_data_table_header_row(); } + $output .= &Apache::loncommon::end_data_table_header_row(); # Done with the HTML header line } elsif ($mode eq 'csv') { # @@ -1916,6 +2112,10 @@ END # Get groups, role, permanent e-mail so we can sort on them if # necessary. foreach my $user (keys(%{$userlist})) { + if ($context eq 'domain' && $user eq $env{'request.role.domain'}.'-domainconfig:'.$env{'request.role.domain'}) { + delete($userlist->{$user}); + next; + } my ($uname,$udom,$role,$groups,$email); if (($statusmode ne 'Any') && ($userlist->{$user}->[$index{'status'}] ne $statusmode)) { @@ -1925,8 +2125,12 @@ END if ($context eq 'domain') { if ($env{'form.roletype'} eq 'domain') { ($role,$uname,$udom) = split(/:/,$user); - - } elsif ($env{'form.roletype'} eq 'construction_space') { + if (($uname eq $env{'request.role.domain'}.'-domainconfig') && + ($udom eq $env{'request.role.domain'})) { + delete($userlist->{$user}); + next; + } + } elsif ($env{'form.roletype'} eq 'author') { ($uname,$udom,$role) = split(/:/,$user,-1); } elsif ($env{'form.roletype'} eq 'course') { ($uname,$udom,$role) = split(/:/,$user); @@ -1986,6 +2190,7 @@ END foreach my $item (@{$keylist}) { $in{$item} = $sdata->[$index{$item}]; } + my $role = $in{'role'}; $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}]); if (! defined($in{'start'}) || $in{'start'} == 0) { $in{'start'} = &mt('none'); @@ -1999,25 +2204,54 @@ END } if ($mode eq 'view' || $mode eq 'html' || $mode eq 'autoenroll') { $r->print(&Apache::loncommon::start_data_table_row()); - $r->print("$rowcount\n"); - if ($linkto eq 'aboutme') { - $in{'username'} = - &Apache::loncommon::aboutmewrapper($in{'username'}, - $in{'username'}, - $in{'domain'}); - } elsif ($linkto eq 'modify') { - $in{'username'} = ''. - $in{'username'}."\n"; + my $checkval; + if ($mode eq 'autoenroll') { + my $cellentry; + if ($in{'type'} eq 'auto') { + $cellentry = ''.&mt('auto').' '; + $autocount ++; + } else { + $cellentry = '
'.&mt('manual').'
'; + $manualcount ++; + if ($in{'lockedtype'}) { + $cellentry .= ''; + $unlockcount ++; + } else { + $cellentry .= ''; + $lockcount ++; + } + $cellentry .= '
'; + } + $r->print("$cellentry\n"); + } else { + $r->print("$rowcount\n"); + $checkval; + if ($actionselect) { + $checkval = $user; + if ($context eq 'course') { + if ($role eq 'st') { + $checkval .= ':st'; + } + $checkval .= ':'.$in{'section'}; + if ($role eq 'st') { + $checkval .= ':'.$in{'type'}.':'.$in{'lockedtype'}; + } + } + $r->print(''); + } } foreach my $item (@cols) { - $r->print(''.$in{$item}.''."\n"); + if ($item eq 'username') { + $r->print(''.&print_username_link($mode,$permission, + \%in).''); + } elsif (($item eq 'start' || $item eq 'end') && ($actionselect)) { + $r->print(''.$in{$item}.''."\n"); + } else { + $r->print(''.$in{$item}.''."\n"); + } } - if ($context eq 'course') { + if (($context eq 'course') && ($mode ne 'autoenroll')) { if ($env{'form.showrole'} eq 'st' || $env{'form.showrole'} eq 'Any') { if ($displayclickers eq 'on') { my $clickers = @@ -2096,17 +2330,305 @@ END } } +sub print_username_link { + my ($mode,$permission,$in) = @_; + my $output; + if ($mode eq 'autoenroll') { + $output = $in->{'username'}; + } elsif (!$permission->{'cusr'}) { + $output = &Apache::loncommon::aboutmewrapper($in->{'username'}, + $in->{'username'}, + $in->{'domain'}); + } else { + $output = '{'username'}','$in->{'domain'}'".')" />'. + $in->{'username'}.''; + } + return $output; +} + sub role_type_names { my %lt = &Apache::lonlocal::texthash ( - 'domain' => 'Domain Roles', - 'construction_space' => 'Co-Author Roles', - 'course' => 'Course Roles', + 'domain' => 'Domain Roles', + 'author' => 'Co-Author Roles', + 'course' => 'Course Roles', ); return %lt; } +sub select_actions { + my ($context,$setting,$statusmode) = @_; + my %lt = &Apache::lonlocal::texthash( + revoke => "Revoke user roles", + delete => "Delete user roles", + reenable => "Re-enable expired user roles", + activate => "Make future user roles active now", + chgdates => "Change starting/ending dates", + chgsec => "Change section associated with user roles", + ); + my ($output,$options,%choices); + if ($statusmode eq 'Any') { + $options .= ' +'; + $choices{'dates'} = 1; + } else { + if ($statusmode eq 'Future') { + $options .= ' +'; + $choices{'dates'} = 1; + } elsif ($statusmode eq 'Expired') { + $options .= ' +'; + $choices{'dates'} = 1; + } + if ($statusmode eq 'Active' || $statusmode eq 'Future') { + $options .= ' + +'; + $choices{'dates'} = 1; + } + } + if ($context eq 'domain') { + $options .= ' +'; + } + if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course')) { + if ($statusmode ne 'Expired') { + $options .= ' +'; + $choices{'sections'} = 1; + } + } + if ($options) { + $output = ''; + if ($choices{'dates'}) { + $output .= + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n". + ''."\n"; + if ($context eq 'course') { + $output .= ''."\n"; + } + } + if ($choices{'sections'}) { + $output .= ''."\n". + ''."\n"; + } + } + return $output; +} + +sub date_section_javascript { + my ($context,$setting) = @_; + my $title; + if (($context eq 'course') || ($context eq 'domain' && $setting eq 'course')) { + $title = &mt('Date and Section selector'); + } else { + $title = &mt('Date selector'); + } + my $output = ' + +ENDTWO + return $output; +} + +sub date_section_selector { + my ($context,$permission) = @_; + my $callingform = $env{'form.callingform'}; + my $formname = 'dateselect'; + my $groupslist = &get_groupslist(); + my $sec_js = &setsections_javascript($formname,$groupslist); + my $output = <<"END"; + +'; + my %lt = &Apache::lonlocal::texthash ( + chac => 'Access dates to apply for selected users', + chse => 'Changes in section affiliation to apply to selected users', + fors => 'For student roles changing the section, will result in a section switch as students may only be in one section of a course at a time.', + forn => 'For a role in a course that is not a student role, a user may have roles in more than one section of a course at a time.', + reta => "Retain each user's current section affiliations?", + dnap => '(Does not apply to student roles).', + ); + my ($date_items,$headertext); + if ($env{'form.bulkaction'} eq 'chgsec') { + $headertext = $lt{'chse'}; + } else { + $headertext = $lt{'chac'}; + my $starttime; + if (($env{'form.bulkaction'} eq 'activate') || + ($env{'form.bulkaction'} eq 'reenable')) { + $starttime = time; + } + $date_items = &date_setting_table($starttime,undef,$context, + $env{'form.bulkaction'},$formname, + $permission); + } + $output .= '

'.$headertext.'

'. + '
'."\n". + $date_items; + if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') { + my ($cnum,$cdom) = &get_course_identity(); + my %sections_count = + &Apache::loncommon::get_sections($cdom,$cnum); + my $info; + if ($env{'form.showrole'} eq 'st') { + $output .= '

'.$lt{'fors'}.'

'; + } elsif ($env{'form.shorole'} eq 'Any') { + $output .= '

'.$lt{'fors'}.'

'. + '

'.$lt{'forn'}.' '; + $info = $lt{'reta'}; + } else { + $output .= '

'.$lt{'forn'}.' '; + $info = $lt{'reta'}; + } + if ($info) { + $info .= ''. + '  '. + ''; + if ($env{'form.showrole'} eq 'Any') { + $info .= '
'.$lt{'dnap'}; + } + $info .= '

'; + } else { + $info = ''; + } + my $sections_select .= &course_sections(\%sections_count,$env{'form.showrole'}); + my $rowtitle = &mt('New section to assign'); + my $secbox = §ion_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context); + $output .= $info.$secbox; + } + $output .= '

'. +&mt('Use "Save" to update the main window with your selections.').'

'. +'

'."\n". +'
'; + return $output; +} + +sub section_picker { + my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode) = @_; + my %sections_count = &Apache::loncommon::get_sections($cdom,$cnum); + my $sections_select .= &course_sections(\%sections_count,$role); + my $secbox = '

'.&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 .= ''."\n". + '
'.&mt('Existing sections')."\n". + '
'.$sections_select.'
'. + &mt('New section').'
'."\n". + ''."\n". + ''."\n". + '
'."\n"; + } else { + $secbox .= ''. + $env{'request.course.sec'}; + } + $secbox .= &Apache::lonhtmlcommon::row_closure(1)."\n". + &Apache::lonhtmlcommon::end_pick_box().'

'; + return $secbox; +} + sub results_header_row { - my ($rolefilter,$statusmode,$context) = @_; + my ($rolefilter,$statusmode,$context,$permission) = @_; my ($description,$showfilter); if ($rolefilter ne 'Any') { $showfilter = $rolefilter; @@ -2115,8 +2637,7 @@ sub results_header_row { $description = &mt('Course - ').$env{'course.'.$env{'request.course.id'}.'.description'}.': '; if ($statusmode eq 'Expired') { $description .= &mt('Users in course with expired [_1] roles',$showfilter); - } - if ($statusmode eq 'Future') { + } elsif ($statusmode eq 'Future') { $description .= &mt('Users in course with future [_1] roles',$showfilter); } elsif ($statusmode eq 'Active') { $description .= &mt('Users in course with active [_1] roles',$showfilter); @@ -2127,8 +2648,17 @@ sub results_header_row { $description .= &mt('All users in course with [_1] roles',$rolefilter); } } - } elsif ($context eq 'construction_space') { - $description = &mt('Author space for [_1].').' '; + if (exists($permission->{'view_section'})) { + if ($env{'form.showrole'} eq 'st') { + $description .= ' '.&mt('(section [_1] only)',$permission->{'view_section'}); + } elsif ($env{'form.showrole'} eq 'any') { + $description .= ' '.&mt('(section [_1] only)',$permission->{'view_section'}); + } + } + } elsif ($context eq 'author') { + $description = + &mt('Author space for [_1]', + &Apache::loncommon::plainname($env{'user.name'},$env{'user.domain'})).':  '; if ($statusmode eq 'Expired') { $description .= &mt('Co-authors with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { @@ -2159,7 +2689,7 @@ sub results_header_row { $description .= &mt('All users in domain with [_1] roles',$rolefilter); } } - } elsif ($env{'form.roletype'} eq 'construction_space') { + } elsif ($env{'form.roletype'} eq 'author') { if ($statusmode eq 'Expired') { $description .= &mt('Co-authors in domain with expired [_1] roles',$showfilter); } elsif ($statusmode eq 'Future') { @@ -2204,12 +2734,27 @@ sub results_header_row { } return $description; } + +sub viewable_section { + my ($permission) = @_; + my $viewablesec; + if (ref($permission) eq 'HASH') { + if (exists($permission->{'view_section'})) { + $viewablesec = $permission->{'view_section'}; + } elsif (exists($permission->{'cusr_section'})) { + $viewablesec = $permission->{'cusr_section'}; + } + } + return $viewablesec; +} + ################################################# ################################################# sub show_drop_list { - my ($r,$classlist,$keylist,$nosort)=@_; + my ($r,$classlist,$keylist,$nosort,$permission)=@_; my $cid=$env{'request.course.id'}; + my ($cnum,$cdom) = &get_course_identity($cid); if (! exists($env{'form.sortby'})) { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['sortby']); @@ -2218,26 +2763,17 @@ sub show_drop_list { if ($sortby !~ /^(username|domain|section|groups|fullname|id|start|end)$/) { $sortby = 'username'; } - my $cdom = $env{'course.'.$cid.'.domain'}; - my $cnum = $env{'course.'.$cid,'.num'}; my ($classgroups) = &Apache::loncoursedata::get_group_memberships( $classlist,$keylist,$cdom,$cnum); # my $action = "drop"; + my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript(); $r->print(< -

@@ -2252,9 +2788,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(<   $lt{'usrn'} $lt{'dom'} @@ -2264,32 +2800,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 +2872,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 +2938,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 +3028,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 +3051,7 @@ sub upfile_drop_add { ####################################### if ($context eq 'course') { $r->print('

'.&mt('Enrolling Users')."

\n

\n"); - } elsif ($context eq 'construction_space') { + } elsif ($context eq 'author') { $r->print('

'.&mt('Updating Co-authors')."

\n

\n"); } else { $r->print('

'.&mt('Adding/Modifying Users')."

\n

\n"); @@ -2648,6 +3191,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 +3245,7 @@ sub upfile_drop_add { $r->print('
'. &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 +3271,7 @@ sub upfile_drop_add { &mt('Authentication changed for [_1] existing users.', $counts{'auth'})."

\n"); } - if (keys(%alerts) > 0) { - if (ref($alerts{'username'}) eq 'HASH') { - foreach my $dom (sort(keys(%{$alerts{'username'}}))) { - my $count; - if (ref($alerts{'username'}{$dom}) eq 'HASH') { - $count = keys(%{$alerts{'username'}{$dom}}); - } - my $domdesc = &Apache::lonnet::domain($domain,'description'); - if (ref($curr_rules{$dom}) eq 'HASH') { - $r->print(&Apache::loncommon::instrule_disallow_msg( - 'username',$domdesc,$count,'upload')); - } - $r->print(&Apache::loncommon::user_rule_formats($dom, - $domdesc,$curr_rules{$dom}{'username'}, - 'username')); - } - } - if (ref($alerts{'id'}) eq 'HASH') { - foreach my $dom (sort(keys(%{$alerts{'id'}}))) { - my $count; - if (ref($alerts{'id'}{$dom}) eq 'HASH') { - $count = keys(%{$alerts{'id'}{$dom}}); - } - my $domdesc = &Apache::lonnet::domain($domain,'description'); - if (ref($curr_rules{$dom}) eq 'HASH') { - $r->print(&Apache::loncommon::instrule_disallow_msg( - 'id',$domdesc,$count,'upload')); - } - $r->print(&Apache::loncommon::user_rule_formats($dom, - $domdesc,$curr_rules{$dom}{'id'},'id')); - } - } - } + $r->print(&print_namespacing_alerts($domain,\%alerts,\%curr_rules)); $r->print('
'); $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','prevphase','currstate'])); $r->print('
'); @@ -2789,6 +3302,46 @@ sub upfile_drop_add { } # end of unless } +sub print_namespacing_alerts { + my ($domain,$alerts,$curr_rules) = @_; + my $output; + if (ref($alerts) eq 'HASH') { + if (keys(%{$alerts}) > 0) { + if (ref($alerts->{'username'}) eq 'HASH') { + foreach my $dom (sort(keys(%{$alerts->{'username'}}))) { + my $count; + if (ref($alerts->{'username'}{$dom}) eq 'HASH') { + $count = keys(%{$alerts->{'username'}{$dom}}); + } + my $domdesc = &Apache::lonnet::domain($domain,'description'); + if (ref($curr_rules->{$dom}) eq 'HASH') { + $output .= &Apache::loncommon::instrule_disallow_msg( + 'username',$domdesc,$count,'upload'); + } + $output .= &Apache::loncommon::user_rule_formats($dom, + $domdesc,$curr_rules->{$dom}{'username'}, + 'username'); + } + } + if (ref($alerts->{'id'}) eq 'HASH') { + foreach my $dom (sort(keys(%{$alerts->{'id'}}))) { + my $count; + if (ref($alerts->{'id'}{$dom}) eq 'HASH') { + $count = keys(%{$alerts->{'id'}{$dom}}); + } + my $domdesc = &Apache::lonnet::domain($domain,'description'); + if (ref($curr_rules->{$dom}) eq 'HASH') { + $output .= &Apache::loncommon::instrule_disallow_msg( + 'id',$domdesc,$count,'upload'); + } + $output .= &Apache::loncommon::user_rule_formats($dom, + $domdesc,$curr_rules->{$dom}{'id'},'id'); + } + } + } + } +} + sub user_change_result { my ($r,$userresult,$authresult,$roleresult,$counts,$flushc,$username, $userchg) = @_; @@ -2836,9 +3389,10 @@ sub user_change_result { } # ========================================================= Menu Phase Two Drop -sub print_expire_menu { - my ($r,$context) = @_; - $r->print("

".&mt("Expire Users' Roles")."

"); +sub print_drop_menu { + my ($r,$context,$permission) = @_; + $r->print('

'.&mt("Drop Students").'

'."\n". + '
'."\n"); my $cid=$env{'request.course.id'}; my ($classlist,$keylist) = &Apache::loncoursedata::get_classlist(); if (! defined($classlist)) { @@ -2846,32 +3400,230 @@ sub print_expire_menu { return; } # Print out the available choices - &show_drop_list($r,$classlist,$keylist); + &show_drop_list($r,$classlist,$keylist,$permission); + $r->print('
'. &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('

'.&mt("$result_text{'ok'}{$choice} role(s) for [quant,_1,user,users,users].",$count).'

'); + if ($count > 0) { + if ($choice eq 'revoke' || $choice eq 'drop') { + $r->print('

'.&mt('Re-enabling will re-activate data for the role.

')); + } + # Flush the course logs so reverse user roles immediately updated + &Apache::lonnet::flushcourselogs(); + } + if ($env{'form.makedatesdefault'}) { + if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') { + $r->print(&make_dates_default($startdate,$enddate)); } } - $r->print('

'.&mt('Dropped [_1] user(s).',$count).'

'); - $r->print('

'.&mt('Re-enrollment will re-activate data.')) if ($count); } sub classlist_drop { @@ -2980,7 +3732,7 @@ sub get_groupslist { $groupslist = join('","',sort(keys(%curr_groups))); $groupslist = '"'.$groupslist.'"'; } - return $groupslist; + return $groupslist; } sub setsections_javascript { @@ -2991,10 +3743,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 +3759,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 +3839,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 1)) { + alert("$alerts{'inea'}. $alerts{'youh'} "+numsections+" $alerts{'sect'}.\\n$alerts{'plsm'}.") + return; + } + for (var j=0; j 0)) { + alert("$alerts{'secd'} $cctext $alerts{'role'}.\\n$alerts{'accr'}."); + section = ""; + } +SCRIPTTOP + if ($mode ne 'upload') { + $dc_setcourse_code .= (<<"ENDSCRIPT"); + var coursename = "_$env{'request.role.domain'}"+"_"+course+"_"+userrole + var numcourse = getIndex(document.$formname.dccourse); + if (numcourse == "-1") { + alert("$alerts{'thwa'}"); + return; + } + else { + document.$formname.elements[numcourse].name = "act"+coursename; + var numnewsec = getIndex(document.$formname.newsec); + if (numnewsec != "-1") { + document.$formname.elements[numnewsec].name = "sec"+coursename; + document.$formname.elements[numnewsec].value = section; + } + var numstart = getIndex(document.$formname.start); + if (numstart != "-1") { + document.$formname.elements[numstart].name = "start"+coursename; + } + var numend = getIndex(document.$formname.end); + if (numend != "-1") { + document.$formname.elements[numend].name = "end"+coursename + } + } + } + document.$formname.submit(); +} + +ENDSCRIPT + } else { + $dc_setcourse_code .= " + document.$formname.sections.value = section; + } + return 'ok'; +} +"; + } + $dc_setcourse_code .= (<<"ENDSCRIPT"); + + function getIndex(caller) { + for (var i=0;i 'You must select a course in the current domain', + inea => 'In each course, each user may only have one student role at a time', + youh => 'You had selected', + sect => 'sections', + plsm => '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', + plsc => 'Please choose a different section name', + mayt => 'may not be used as the name for a section, as it is the name of a course group', + secn => 'Section names and group names must be distinct', + secd => 'Section designations do not apply to ', + role => 'roles', + accr => 'role will be added with access to all sections', + thwa => 'There was a problem with your course selection' + ); + return %alerts; +} + + 1; 500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.