--- loncom/interface/lonuserutils.pm 2009/04/22 17:42:36 1.89 +++ loncom/interface/lonuserutils.pm 2010/01/20 20:28:40 1.97.2.6 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Utility functions for managing LON-CAPA user accounts # -# $Id: lonuserutils.pm,v 1.89 2009/04/22 17:42:36 bisitz Exp $ +# $Id: lonuserutils.pm,v 1.97.2.6 2010/01/20 20:28:40 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -91,7 +91,7 @@ sub modifyuserrole { if ($setting eq 'course' || $context eq 'course') { $scope = '/'.$cid; $scope =~ s/\_/\//g; - if ($role ne 'cc' && $sec ne '') { + if (($role ne 'cc') && ($role ne 'co') && ($sec ne '')) { $scope .='/'.$sec; } } elsif ($context eq 'domain') { @@ -235,7 +235,7 @@ sub domain_roles_select { # domain context # # Role types - my @roletypes = ('domain','author','course'); + my @roletypes = ('domain','author','course','community'); my %lt = &role_type_names(); # # build up the menu information to be passed to @@ -247,6 +247,10 @@ sub domain_roles_select { foreach my $roletype (@roletypes) { # set up the text for this domain $select_menus{$roletype}->{'text'}= $lt{$roletype}; + my $crstype; + if ($roletype eq 'community') { + $crstype = 'Community'; + } # we want a choice of 'default' as the default in the second menu if ($env{'form.roletype'} ne '') { $select_menus{$roletype}->{'default'} = $env{'form.showrole'}; @@ -261,7 +265,7 @@ sub domain_roles_select { @roles = &construction_space_roles(); } else { my $custom = 1; - @roles = &course_roles('domain',undef,$custom); + @roles = &course_roles('domain',undef,$custom,$roletype); } my $order = ['Any',@roles]; $select_menus{$roletype}->{'order'} = $order; @@ -271,14 +275,15 @@ sub domain_roles_select { &mt('Custom role'); } else { $select_menus{$roletype}->{'select2'}->{$role} = - &Apache::lonnet::plaintext($role); + &Apache::lonnet::plaintext($role,$crstype); } } $select_menus{$roletype}->{'select2'}->{'Any'} = &mt('Any'); } my $result = &Apache::loncommon::linked_select_forms ('studentform',(' 'x3).&mt('Role: '),$env{'form.roletype'}, - 'roletype','showrole',\%select_menus,['domain','author','course']); + 'roletype','showrole',\%select_menus, + ['domain','author','course','community']); return $result; } @@ -290,7 +295,7 @@ sub hidden_input { } sub print_upload_manager_header { - my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission)=@_; + my ($r,$datatoken,$distotal,$krbdefdom,$context,$permission,$crstype)=@_; my $javascript; # if (! exists($env{'form.upfile_associate'})) { @@ -327,10 +332,12 @@ sub print_upload_manager_header { my $javascript_validations = &javascript_validations('upload',$krbdefdom,$password_choice,undef, $env{'request.role.domain'},$context, - $groupslist); - my $checked=(($env{'form.noFirstLine'})?' checked="checked" ':''); - $r->print(&mt('Total number of records found in file: [_1]',''.$distotal.''). - "
\n"); + $groupslist,$crstype); + my $checked=(($env{'form.noFirstLine'})?' checked="checked"':''); + $r->print('

' + .&mt('Total number of records found in file: [_1]' + ,''.$distotal.'') + ."

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

'. &mt('Identify fields in uploaded list')."

\n"); $r->print(&mt('Enter as many fields as you can.
The system will inform you and bring you back to this page,
if the data selected are insufficient to add users.')."
\n"); @@ -345,17 +352,20 @@ sub print_upload_manager_header { &mt('Ignore First Line').'
'); $r->print('
'); + 'onclick="javascript:this.form.associate.value=\'Reverse Association\';submit(this.form);" />'); $r->print("

\n". ''); + '// '."\n". + ''); } ############################################################### ############################################################### sub javascript_validations { my ($mode,$krbdefdom,$curr_authtype,$curr_authfield,$domain, - $context,$groupslist)=@_; + $context,$groupslist,$crstype)=@_; my %param = ( kerb_def_dom => $krbdefdom, curr_authtype => $curr_authtype, @@ -376,10 +386,11 @@ sub javascript_validations { if (($context eq 'course') || ($context eq 'domain')) { if ($context eq 'course') { if ($env{'request.course.sec'} eq '') { - $setsection_call = 'setSections(document.'.$param{'formname'}.');'; + $setsection_call = 'setSections(document.'.$param{'formname'}."'$crstype'".');'; + $setsections_js = &setsections_javascript($param{'formname'},$groupslist, - $mode); + $mode,'',$crstype); } else { $setsection_call = "'ok'"; } @@ -401,7 +412,7 @@ sub javascript_validations { krb => 'You need to specify the Kerberos domain.', ipass => 'You need to specify the initial password.', name => 'The optional name field was not specified.', - snum => 'The optional ID number field was not specified.', + snum => 'The optional student/employee ID field was not specified.', section => 'The optional section field was not specified.', email => 'The optional e-mail address field was not specified.', role => 'The optional role field was not specified.', @@ -738,7 +749,7 @@ ENDPICK ############################################################### ############################################################### sub print_upload_manager_footer { - my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission) = @_; + my ($r,$i,$keyfields,$defdom,$today,$halfyear,$context,$permission,$crstype) = @_; my $form = 'document.studentform'; my $formname = 'studentform'; my ($krbdef,$krbdefdom) = @@ -756,79 +767,146 @@ sub print_upload_manager_footer { my $intform = &Apache::loncommon::authform_internal(%param); my $locform = &Apache::loncommon::authform_local(%param); my $date_table = &date_setting_table(undef,undef,$context,undef, - $formname,$permission); + $formname,$permission,$crstype); + my $Str = "\n".'
'; $Str .= &hidden_input('nfields',$i); $Str .= &hidden_input('keyfields',$keyfields); - $Str .= "

".&mt('Login Type')."

\n"; + + $Str .= '

'.&mt('Options').'

' + .&Apache::lonhtmlcommon::start_pick_box(); + + $Str .= &Apache::lonhtmlcommon::row_title(&mt('Login Type')); if ($context eq 'domain') { - $Str .= '

'.&mt('Change authentication for existing users in domain "[_1]" to these settings?',$defdom).'   

'; + $Str .= '

' + .&mt('Change authentication for existing users in domain "[_1]" to these settings?' + ,$defdom) + .' ' + .'  ' + .'

'; } else { - $Str .= "

\n". - &mt('Note: This will not take effect if the user already exists.'). + $Str .= '

'."\n". + &mt('This will not take effect if the user already exists.'). &Apache::loncommon::help_open_topic('Auth_Options'). "

\n"; } $Str .= &set_login($defdom,$krbform,$intform,$locform); + my ($home_server_pick,$numlib) = &Apache::loncommon::home_server_form_item($defdom,'lcserver', 'default','hide'); if ($numlib > 1) { - $Str .= '

'.&mt('LON-CAPA Home Server for New Users')."

\n". - &mt('LON-CAPA domain: [_1] with home server: [_2]',$defdom, - $home_server_pick).'
'; - } else { - $Str .= $home_server_pick; - } - $Str .= '

'.&mt('Default domain').'

'."\n". - &Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1); - $Str .= '

'.&mt('Starting and Ending Dates'). - "

\n"; - $Str .= "

\n".$date_table."

\n"; + $Str .= &Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + &mt('LON-CAPA Home Server for New Users')) + .&mt('LON-CAPA domain: [_1] with home server:','"'.$defdom.'"') + .$home_server_pick + .&Apache::lonhtmlcommon::row_closure(); + } else { + $Str .= $home_server_pick. + &Apache::lonhtmlcommon::row_closure(); + } + + $Str .= &Apache::lonhtmlcommon::row_title(&mt('Default domain')) + .&Apache::loncommon::select_dom_form($defdom,'defaultdomain',undef,1) + .&Apache::lonhtmlcommon::row_closure(); + + $Str .= &Apache::lonhtmlcommon::row_title(&mt('Starting and Ending Dates')) + ."

\n".$date_table."

\n" + .&Apache::lonhtmlcommon::row_closure(); + if ($context eq 'domain') { - $Str .= '

'.&mt('Settings for assigning roles:').'

'."\n". - &mt('Pick the action to take on roles for these users:').'
      '; - } - if ($context eq 'author') { - $Str .= '

'.&mt('Default role')."

\n". - &mt('Choose the role to assign to users without a value specified in the uploaded file'); + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Settings for assigning roles')) + .&mt('Pick the action to take on roles for these users:').'
' + .'' + .'   ' + .'   ' + .''; + } elsif ($context eq 'author') { + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Default role')) + .&mt('Choose the role to assign to users without a value specified in the uploaded file.') } elsif ($context eq 'course') { - $Str .= '

'.&mt('Default role and section')."

\n". - &mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file'); - } else { - $Str .= '

'.&mt('Default role and/or section(s)')."
\n". - &mt('Role and/or section(s) for users without values specified in the uploaded file.'); + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Default role and section')) + .&mt('Choose the role and/or section(s) to assign to users without values specified in the uploaded file.'); + } else { + $Str .= &Apache::lonhtmlcommon::row_title( + &mt('Default role and/or section(s)')) + .&mt('Role and/or section(s) for users without values specified in the uploaded file.'); } - $Str .= '
'; if (($context eq 'domain') || ($context eq 'author')) { + $Str .= '
'; my ($options,$cb_script,$coursepick) = &default_role_selector($context,1); if ($context eq 'domain') { - $Str .= ''.&mt('Domain Level').'
'.$options.'

'.&mt('Course Level').'
'.$cb_script.$coursepick; + $Str .= '

' + .''.&mt('Domain Level').'
' + .$options + .'

' + .''.&mt('Course Level').'' + .'

' + .$cb_script.$coursepick + .&Apache::lonhtmlcommon::row_closure(); } elsif ($context eq 'author') { - $Str .= $options; + $Str .= $options + .&Apache::lonhtmlcommon::row_closure(1); # last row in pick_box } } else { my ($cnum,$cdom) = &get_course_identity(); my $rowtitle = &mt('section'); my $secbox = §ion_picker($cdom,$cnum,'Any',$rowtitle, - $permission,$context,'upload'); - $Str .= $secbox."

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

\n". - '


'.&mt('Students selected from this list can be dropped.').'

'."\n"; + $permission,$context,'upload',$crstype); + $Str .= $secbox + .&Apache::lonhtmlcommon::row_closure(); + my %lt; + if ($crstype eq 'Community') { + %lt = &Apache::lonlocal::texthash ( + disp => 'Display members with current/future access who are not in the uploaded file', + stus => 'Members selected from this list can be dropped.' + ); + } else { + %lt = &Apache::lonlocal::texthash ( + disp => 'Display students with current/future access who are not in the uploaded file', + stus => 'Students selected from this list can be dropped.' + ); + } + $Str .= &Apache::lonhtmlcommon::row_title(&mt('Full Update')) + .'
' + .$lt{'stus'} + .&Apache::lonhtmlcommon::row_closure(); } if ($context eq 'course' || $context eq 'domain') { $Str .= &forceid_change($context); } + + $Str .= &Apache::lonhtmlcommon::end_pick_box(); $Str .= '
'; - $Str .= ''); &print_upload_manager_footer($r,$i,$keyfields,$defdom,$today,$halfyear, - $context,$permission); + $context,$permission,$crstype); } sub setup_date_selectors { @@ -1012,7 +1090,7 @@ sub get_dates_from_form { } sub date_setting_table { - my ($starttime,$endtime,$mode,$bulkaction,$formname,$permission) = @_; + my ($starttime,$endtime,$mode,$bulkaction,$formname,$permission,$crstype) = @_; my $nolink; if ($bulkaction) { $nolink = 1; @@ -1029,9 +1107,13 @@ sub date_setting_table { ($env{'form.action'} eq 'upload')) { if ($env{'request.course.sec'} eq '') { $dateDefault = ''. - ''; + ''; } } } @@ -1060,7 +1142,7 @@ sub date_setting_table { } sub make_dates_default { - my ($startdate,$enddate,$context) = @_; + my ($startdate,$enddate,$context,$crstype = @_; my $result = ''; if ($context eq 'course') { my ($cnum,$cdom) = &get_course_identity(); @@ -1068,22 +1150,30 @@ sub make_dates_default { {'default_enrollment_start_date'=>$startdate, 'default_enrollment_end_date' =>$enddate},$cdom,$cnum); if ($put_result eq 'ok') { - $result .= &mt('Set default start and end access dates for course.'). - '
'."\n"; + if ($crstype eq 'Community') { + $result .= &mt('Set default start and end access dates for community.'); + } else { + $result .= &mt('Set default start and end access dates for course.'); + } + $result .= '
'."\n"; # # Refresh the course environment &Apache::lonnet::coursedescription($env{'request.course.id'}, {'freshen_cache' => 1}); } else { - $result .= &mt('Unable to set default access dates for course.').":".$put_result. - '
'; + if ($crstype eq 'Community') { + $result .= &mt('Unable to set default access dates for community'); + } else { + $result .= &mt('Unable to set default access dates for course'); + } + $result .= ':'.$put_result.'
'; } } return $result; } sub default_role_selector { - my ($context,$checkpriv) = @_; + my ($context,$checkpriv,$crstype) = @_; my %customroles; my ($options,$coursepick,$cb_jscript); if ($context ne 'author') { @@ -1099,7 +1189,7 @@ sub default_role_selector { $options = ''."\n". + ''."\n". ''. ''. '
'. @@ -1140,6 +1230,7 @@ sub default_role_selector { $env{'request.role.domain'}.'" />'. ''. ''. + ''. '
'. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table()."\n"; @@ -1149,13 +1240,13 @@ sub default_role_selector { } sub default_course_roles { - my ($context,$checkpriv,%customroles) = @_; + my ($context,$checkpriv,$crstype,%customroles) = @_; my $output; my $custom = 1; - my @roles = &course_roles($context,$checkpriv,$custom); + my @roles = &course_roles($context,$checkpriv,$custom,lc($crstype)); foreach my $role (@roles) { if ($role ne 'cr') { - my $plrole=&Apache::lonnet::plaintext($role); + my $plrole=&Apache::lonnet::plaintext($role,$crstype); $output .= ' '; } } @@ -1204,8 +1295,14 @@ sub domain_roles { } sub course_roles { - my ($context,$checkpriv,$custom) = @_; - my @allroles = &roles_by_context('course',$custom); + my ($context,$checkpriv,$custom,$roletype) = @_; + my $crstype; + if ($roletype eq 'community') { + $crstype = 'Community' ; + } else { + $crstype = 'Course'; + } + my @allroles = &roles_by_context('course',$custom,$crstype); my @roles; if ($context eq 'domain') { @roles = @allroles; @@ -1216,7 +1313,7 @@ sub course_roles { if (&Apache::lonnet::allowed('c'.$role,$env{'request.course.id'})) { push(@roles,$role); } else { - if ($role ne 'cc' && $env{'request.course.sec'} ne '') { + if ((($role ne 'cc') && ($role ne 'co')) && ($env{'request.course.sec'} ne '')) { if (&Apache::lonnet::allowed('c'.$role, $env{'request.course.id'}.'/'. $env{'request.course.sec'})) { @@ -1234,19 +1331,19 @@ sub course_roles { } sub curr_role_permissions { - my ($context,$setting,$checkpriv) = @_; + my ($context,$setting,$checkpriv,$type) = @_; my $custom = 1; my @roles; if ($context eq 'author') { @roles = &construction_space_roles($checkpriv); } elsif ($context eq 'domain') { if ($setting eq 'course') { - @roles = &course_roles($context,$checkpriv,$custom); + @roles = &course_roles($context,$checkpriv,$custom,$type); } else { @roles = &domain_roles($checkpriv); } } elsif ($context eq 'course') { - @roles = &course_roles($context,$checkpriv,$custom); + @roles = &course_roles($context,$checkpriv,$custom,$type); } return @roles; } @@ -1315,9 +1412,9 @@ sub print_userlist { 'html' => 'HTML'); my $output_selector = ''); return; } - if (!(($context eq 'domain') && ($env{'form.roletype'} eq 'course'))) { + if (!(($context eq 'domain') && + (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community')))) { $r->print(' '.&list_submit_button(&mt('Update Display')). "\n

\n"); } my ($indexhash,$keylist) = &make_keylist_array(); - my (%userlist,%userinfo); - if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { + my (%userlist,%userinfo,$clearcoursepick); + if (($context eq 'domain') && + ($env{'form.roletype'} eq 'course') || + ($env{'form.roletype'} eq 'community')) { + my ($crstype,$numcodes,$title,$warning); + if ($env{'form.roletype'} eq 'course') { + $crstype = 'Course'; + $numcodes = $totcodes; + $title = &mt('Select Courses'); + $warning = &mt('Warning: data retrieval for multiple courses can take considerable time, as this operation is not currently optimized.'); + } elsif ($env{'form.roletype'} eq 'community') { + $crstype = 'Community'; + $numcodes = 0; + $title = &mt('Select Communities'); + $warning = &mt('Warning: data retrieval for multiple communities can take considerable time, as this operation is not currently optimized.'); + } my $courseform = - &Apache::lonhtmlcommon::course_selection($formname,$totcodes, - $codetitles,$idlist,$idlist_titles); + &Apache::lonhtmlcommon::course_selection($formname,$numcodes, + $codetitles,$idlist,$idlist_titles,$crstype); $r->print('

'.&Apache::lonhtmlcommon::start_pick_box()."\n". &Apache::lonhtmlcommon::start_pick_box()."\n". - &Apache::lonhtmlcommon::row_title(&mt('Select Course(s)'), - 'LC_oddrow_value')."\n". + &Apache::lonhtmlcommon::row_title($title,'LC_oddrow_value')."\n". $courseform."\n". &Apache::lonhtmlcommon::row_closure(1). &Apache::lonhtmlcommon::end_pick_box().'

'. - '

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

'.&mt('Warning: data retrieval for multiple courses can take considerable time, as this operation is not currently optimized.').''."\n"); - if ($env{'form.coursepick'}) { + '

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

'.$warning.''."\n"); + $clearcoursepick = 0; + if (($env{'form.origroletype'} ne '') && + ($env{'form.origroletype'} ne $env{'form.roletype'})) { + $clearcoursepick = 1; + } + if (($env{'form.coursepick'}) && (!$clearcoursepick)) { $r->print('
'.&mt('Searching').' ...
 
'); } } else { @@ -1439,7 +1556,7 @@ sub print_userlist { } } } elsif ($env{'form.roletype'} eq 'course') { - if ($env{'form.coursepick'}) { + if (($env{'form.coursepick'}) && (!$clearcoursepick)) { my %courses = &process_coursepick(); my %allusers; my $hidepriv = 1; @@ -1450,7 +1567,8 @@ sub print_userlist { my (@roles,@sections,%access,%users,%userdata, %statushash); if ($env{'form.showrole'} eq 'Any') { - @roles = &course_roles($context,undef,$custom); + @roles = &course_roles($context,undef,$custom, + $env{'form.roletype'}); } else { @roles = ($env{'form.showrole'}); } @@ -1496,6 +1614,8 @@ sub print_userlist { $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"); + } elsif ($env{'form.roletype'} eq 'community') { + $r->print(&mt('There are no community users to display')."\n"); } } elsif ($context eq 'course') { $r->print(&mt('There are no course users to display.')."\n"); @@ -1526,7 +1646,7 @@ sub role_filter { my $output; my $roleselected = ''; if ($env{'form.showrole'} eq 'Any') { - $roleselected = ' selected="selected" '; + $roleselected = ' selected="selected"'; } my ($role_select); if ($context eq 'domain') { @@ -1538,17 +1658,26 @@ sub role_filter { $role_select = ' END } + } elsif ($context eq 'domain') { + if ($setting eq 'community') { + $crstype = 'Community'; + } elsif ($crstype eq 'course') { + $crstype = 'Course'; + } } if ($mode ne 'autoenroll' && $mode ne 'pickauthor') { my $check_uncheck_js = &Apache::loncommon::check_uncheck_jscript(); @@ -2021,6 +2161,7 @@ END $r->print(< +// $date_sec_selector @@ -2091,10 +2244,13 @@ END 'aboutme' => "Display a user's personal information page", 'owin' => "Open in a new window", 'modify' => "Modify a user's information", + 'track' => "View a user's recent activity", 'clicker' => "Clicker-ID", ); if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { $lt{'extent'} = &mt('Course(s): description, section(s), status'); + } elsif ($context eq 'domain' && $env{'form.roletype'} eq 'community') { + $lt{'extent'} = &mt('Communities: description, section(s), status'); } elsif ($context eq 'author') { $lt{'extent'} = &mt('Author'); } @@ -2106,18 +2262,21 @@ END if ($context eq 'course') { push(@cols,'section'); } - if (!($context eq 'domain' && $env{'form.roletype'} eq 'course')) { + if (!($context eq 'domain' && ($env{'form.roletype'} eq 'course') + && ($env{'form.roletype'} eq 'community'))) { push(@cols,('start','end')); } if ($env{'form.showrole'} eq 'Any' || $env{'form.showrole'} eq 'cr') { push(@cols,'role'); } if ($context eq 'domain' && ($env{'form.roletype'} eq 'author' || - $env{'form.roletype'} eq 'course')) { + $env{'form.roletype'} eq 'course' || + $env{'form.roletype'} eq 'community')) { push (@cols,'extent'); } - if (($statusmode eq 'Any') && - (!($context eq 'domain' && $env{'form.roletype'} eq 'course'))) { + if (($statusmode eq 'Any') && + (!($context eq 'domain' && (($env{'form.roletype'} eq 'course') + || ($env{'form.roletype'} eq 'community'))))) { push(@cols,'status'); } if ($context eq 'course') { @@ -2135,7 +2294,8 @@ END my $results_description; if ($mode ne 'autoenroll') { $results_description = &results_header_row($rolefilter,$statusmode, - $context,$permission,$mode); + $context,$permission,$mode,$crstype); + $r->print(''.$results_description.'

'); } my ($output,$actionselect,%canchange,%canchangesec); @@ -2162,9 +2322,9 @@ END if ($env{'form.showrole'} eq 'Any') { my $custom = 1; if ($context eq 'domain') { - @allroles = &roles_by_context($setting,$custom); + @allroles = &roles_by_context($setting,$custom,$crstype); } else { - @allroles = &roles_by_context($context,$custom); + @allroles = &roles_by_context($context,$custom,$crstype); } } else { @allroles = ($env{'form.showrole'}); @@ -2204,6 +2364,11 @@ END if ($permission->{'cusr'}) { unshift (@linkdests,'modify'); } + if (&Apache::lonnet::allowed('vsa', $env{'request.course.id'}) || + &Apache::lonnet::allowed('vsa', $env{'request.course.id'}.'/'. + $env{'request.course.sec'})) { + push(@linkdests,'track'); + } $output .= ''; my $usernamelink = $env{'form.usernamelink'}; if ($usernamelink eq '') { @@ -2365,7 +2530,8 @@ END } } elsif ($env{'form.roletype'} eq 'author') { ($uname,$udom,$role) = split(/:/,$user,-1); - } elsif ($env{'form.roletype'} eq 'course') { + } elsif (($env{'form.roletype'} eq 'course') || + ($env{'form.roletype'} eq 'community')) { ($uname,$udom,$role) = split(/:/,$user); } } else { @@ -2472,7 +2638,7 @@ END if ($clickers!~/\w/) { $clickers='-'; } $in{'clicker'} = $clickers; my $role = $in{'role'}; - $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}]); + $in{'role'}=&Apache::lonnet::plaintext($sdata->[$index{'role'}],$crstype); if (! defined($in{'start'}) || $in{'start'} == 0) { $in{'start'} = &mt('none'); } else { @@ -2572,7 +2738,7 @@ END } if ($env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}) { if ($displayphotos eq 'on' && $role eq 'st' && $in{'photo'} ne '') { - $r->print(' '); + $r->print(' '); } else { $r->print('   '); } @@ -2770,6 +2936,8 @@ sub role_type_names { 'domain' => 'Domain Roles', 'author' => 'Co-Author Roles', 'course' => 'Course Roles', + 'community' => 'Community Roles', + ); return %lt; } @@ -2859,8 +3027,8 @@ sub select_actions { } } if ($choices{'sections'}) { - $output .= ''."\n". - ''."\n"; + $output .= ''."\n". + ''."\n"; } } return $output; @@ -2874,9 +3042,9 @@ sub date_section_javascript { delete => "Check the boxes for any users for whom roles are to be deleted, and click 'Proceed'", none => "Choose an action to take for selected users", ); - my $output = ' - ENDTWO return $output; } sub date_section_selector { - my ($context,$permission) = @_; + my ($context,$permission,$crstype) = @_; my $callingform = $env{'form.callingform'}; my $formname = 'dateselect'; my $groupslist = &get_groupslist(); my $sec_js = &setsections_javascript($formname,$groupslist); my $output = <<"END"; ENDJS my %lt = &Apache::lonlocal::texthash ( @@ -2988,7 +3159,7 @@ ENDJS 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).', + dnap => '(Does not apply to student roles).', ); my ($date_items,$headertext); if ($env{'form.bulkaction'} eq 'chgsec') { @@ -3002,13 +3173,19 @@ ENDJS } $date_items = &date_setting_table($starttime,undef,$context, $env{'form.bulkaction'},$formname, - $permission); + $permission,$crstype); } $output .= '

'.$headertext.'

'. '
'."\n". $date_items; if ($context eq 'course' && $env{'form.bulkaction'} eq 'chgsec') { my ($cnum,$cdom) = &get_course_identity(); + my $crstype = &Apache::loncommon::course_type(); + if ($crstype eq 'Community') { + $lt{'fors'} = &mt('For member roles changing the section, will result in a section switch as members may only be in one section of a community at a time.'); + $lt{'forn'} = &mt('For a role in a community that is not a member role, a user may have roles in more than one section of a community at a time.'); + $lt{'dnap'} = &mt('(Does not apply to member roles).'); + } my $info; if ($env{'form.showrole'} eq 'st') { $output .= '

'.$lt{'fors'}.'

'; @@ -3034,7 +3211,7 @@ ENDJS $info = ''; } my $rowtitle = &mt('New section to assign'); - my $secbox = §ion_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context); + my $secbox = §ion_picker($cdom,$cnum,$env{'form.showrole'},$rowtitle,$permission,$context,'',$crstype); $output .= $info.$secbox; } $output .= '

'. @@ -3044,13 +3221,13 @@ ENDJS } sub section_picker { - my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode) = @_; + my ($cdom,$cnum,$role,$rowtitle,$permission,$context,$mode,$crstype) = @_; 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); + &default_role_selector($context,1,$crstype); $secbox .= &Apache::lonhtmlcommon::row_title(&mt('role'),'LC_oddrow_value'). $options. &Apache::lonhtmlcommon::row_closure(1)."\n"; } @@ -3074,26 +3251,50 @@ sub section_picker { } sub results_header_row { - my ($rolefilter,$statusmode,$context,$permission,$mode) = @_; + my ($rolefilter,$statusmode,$context,$permission,$mode,$crstype) = @_; my ($description,$showfilter); if ($rolefilter ne 'Any') { $showfilter = $rolefilter; } if ($context eq 'course') { if ($mode eq 'csv' || $mode eq 'excel') { - $description = &mt('Course - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' '; + if ($crstype eq 'Community') { + $description = &mt('Community - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' '; + } else { + $description = &mt('Course - [_1]:',$env{'course.'.$env{'request.course.id'}.'.description'}).' '; + } } if ($statusmode eq 'Expired') { - $description .= &mt('Users in course with expired [_1] roles',$showfilter); + if ($crstype eq 'Community') { + $description .= &mt('Users in community with expired [_1] roles',$showfilter); + } else { + $description .= &mt('Users in course with expired [_1] roles',$showfilter); + } } elsif ($statusmode eq 'Future') { - $description .= &mt('Users in course with future [_1] roles',$showfilter); + if ($crstype eq 'Community') { + $description .= &mt('Users in community with future [_1] roles',$showfilter); + } else { + $description .= &mt('Users in course with future [_1] roles',$showfilter); + } } elsif ($statusmode eq 'Active') { - $description .= &mt('Users in course with active [_1] roles',$showfilter); + if ($crstype eq 'Community') { + $description .= &mt('Users in community with active [_1] roles',$showfilter); + } else { + $description .= &mt('Users in course with active [_1] roles',$showfilter); + } } else { if ($rolefilter eq 'Any') { - $description .= &mt('All users in course'); + if ($crstype eq 'Community') { + $description .= &mt('All users in community'); + } else { + $description .= &mt('All users in course'); + } } else { - $description .= &mt('All users in course with [_1] roles',$rolefilter); + if ($crstype eq 'Community') { + $description .= &mt('All users in community with [_1] roles',$rolefilter); + } else { + $description .= &mt('All users in course with [_1] roles',$rolefilter); + } } } my $constraint; @@ -3101,7 +3302,7 @@ sub results_header_row { if ($viewablesec ne '') { if ($env{'form.showrole'} eq 'st') { $constraint = &mt('only users in section "[_1]"',$viewablesec); - } elsif ($env{'form.showrole'} ne 'cc') { + } elsif (($env{'form.showrole'} ne 'cc') && ($env{'form.showrole'} ne 'co')) { $constraint = &mt('only users affiliated with no section or section "[_1]"',$viewablesec); } if (($env{'form.grpfilter'} ne 'all') && ($env{'form.grpfilter'} ne '')) { @@ -3189,19 +3390,29 @@ sub results_header_row { $description .= &mt('All co-authors in domain with [_1] roles',$rolefilter); } } - } elsif ($env{'form.roletype'} eq 'course') { + } elsif (($env{'form.roletype'} eq 'course') || + ($env{'form.roletype'} eq 'community')) { + my $coursefilter = $env{'form.coursepick'}; - if ($coursefilter eq 'category') { - my $instcode = &instcode_from_coursefilter(); - if ($instcode eq '.') { + if ($env{'form.roletype'} eq 'course') { + if ($coursefilter eq 'category') { + my $instcode = &instcode_from_coursefilter(); + if ($instcode eq '.') { + $description .= &mt('All courses in domain').' - '; + } else { + $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - '; + } + } elsif ($coursefilter eq 'selected') { + $description .= &mt('Selected courses in domain').' - '; + } elsif ($coursefilter eq 'all') { $description .= &mt('All courses in domain').' - '; - } else { - $description .= &mt('Courses in domain with institutional code: [_1]',$instcode).' - '; } - } elsif ($coursefilter eq 'selected') { - $description .= &mt('Selected courses in domain').' - '; - } elsif ($coursefilter eq 'all') { - $description .= &mt('All courses in domain').' - '; + } elsif ($env{'form.roletype'} eq 'community') { + if ($coursefilter eq 'selected') { + $description .= &mt('Selected communities in domain').' - '; + } elsif ($coursefilter eq 'all') { + $description .= &mt('All communities in domain').' - '; + } } if ($statusmode eq 'Expired') { $description .= &mt('users with expired [_1] roles',$showfilter); @@ -3238,7 +3449,7 @@ sub viewable_section { ################################################# ################################################# sub show_drop_list { - my ($r,$classlist,$nosort,$permission) = @_; + my ($r,$classlist,$nosort,$permission,$crstype) = @_; my $cid = $env{'request.course.id'}; my ($cnum,$cdom) = &get_course_identity($cid); if (! exists($env{'form.sortby'})) { @@ -3256,7 +3467,9 @@ sub show_drop_list {

@@ -3282,7 +3495,11 @@ END } } if (!$studentcount) { - $r->print(&mt('There are no students to drop.')); + if ($crstype eq 'Community') { + $r->print(&mt('There are no members to drop.')); + } else { + $r->print(&mt('There are no students to drop.')); + } return; } my ($classgroups) = &Apache::loncoursedata::get_group_memberships( @@ -3290,11 +3507,16 @@ END my %lt=&Apache::lonlocal::texthash('usrn' => "username", 'dom' => "domain", 'sn' => "student name", + 'mn' => "member name", 'sec' => "section", 'start' => "start date", 'end' => "end date", 'groups' => "active groups", ); + my $nametitle = $lt{'sn'}; + if ($crstype eq 'Community') { + $nametitle = $lt{'mn'}; + } if ($nosort) { $r->print(&Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row()); @@ -3303,7 +3525,7 @@ END $lt{'usrn'} $lt{'dom'} ID - $lt{'sn'} + $nametitle $lt{'sec'} $lt{'start'} $lt{'end'} @@ -3322,7 +3544,7 @@ END ID - $lt{'sn'} + $nametitle $lt{'sec'} @@ -3392,9 +3614,14 @@ END $r->print(&Apache::loncommon::end_data_table().'
'); %lt=&Apache::lonlocal::texthash( 'dp' => "Drop Students", + 'dm' => "Drop Members", 'ca' => "check all", 'ua' => "uncheck all", ); + my $btn = $lt{'dp'}; + if ($crstype eq 'Community') { + $btn = $lt{'dm'}; + } $r->print(<<"END");

@@ -3402,7 +3629,7 @@ END

- +

END return; @@ -3416,25 +3643,38 @@ sub print_first_users_upload_form { my $str; $str = ''; $str .= ''; - $str .= ''; + $str .= ''; + + $str .= '

'.&mt('Upload a file containing information about users').'

'."\n"; - $str .= '

' - .&mt('Please upload an UTF8 encoded file to ensure a correct character encoding in your classlist.') - .'

'."\n"; - $str .= &Apache::loncommon::upfile_select_html(); - $str .= '

'; - $str .= &Apache::loncommon::help_open_topic("Course_Create_Class_List", - &mt("How do I create a users list from a spreadsheet")). - "
\n"; - $str .= &Apache::loncommon::help_open_topic("Course_Convert_To_CSV", - &mt("How do I create a CSV file from a spreadsheet")); - $str .= "

\n"; - $str .= "

\n"; - $str .= '

\n"; - $str .= ''."
\n"; + + # Excel and CSV Help + $str .= '

' + .&Apache::loncommon::help_open_topic("Course_Create_Class_List", + &mt("How do I create a users list from a spreadsheet")) + ."
\n" + .&Apache::loncommon::help_open_topic("Course_Convert_To_CSV", + &mt("How do I create a CSV file from a spreadsheet")) + ."

\n"; + + $str .= &Apache::lonhtmlcommon::start_pick_box() + .&Apache::lonhtmlcommon::row_title(&mt('File')) + .&Apache::loncommon::upfile_select_html() + .&Apache::lonhtmlcommon::row_closure() + .&Apache::lonhtmlcommon::row_title( + '') + .'' + .&Apache::lonhtmlcommon::row_closure(1) + .&Apache::lonhtmlcommon::end_pick_box(); + + $str .= '

' + .'' + .'

'; + $str .= &Apache::loncommon::end_page(); + $r->print($str); return; } @@ -3481,9 +3721,22 @@ sub upfile_drop_add { 'domain_choice' => 'scalar', 'inststatus_choice' => 'scalar'}); # + my ($cid,$crstype,$setting); + if ($context eq 'domain') { + $setting = $env{'form.roleaction'}; + } + if ($env{'request.course.id'} ne '') { + $cid = $env{'request.course.id'}; + $crstype = &Apache::loncommon::course_type(); + } elsif ($setting eq 'course') { + if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) { + $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'}; + $crstype = &Apache::loncommon::course_type($cid); + } + } my ($startdate,$enddate) = &get_dates_from_form(); if ($env{'form.makedatesdefault'}) { - $r->print(&make_dates_default($startdate,$enddate,$context)); + $r->print(&make_dates_default($startdate,$enddate,$context,$crstype); } # Determine domain and desired host (home server) my $defdom=$env{'request.role.domain'}; @@ -3535,28 +3788,20 @@ sub upfile_drop_add { $amode = ''; # This causes the loop below to be skipped } } - my ($cid,$defaultsec,$defaultrole,$setting); + my ($defaultsec,$defaultrole); if ($context eq 'domain') { - $setting = $env{'form.roleaction'}; if ($setting eq 'domain') { $defaultrole = $env{'form.defaultrole'}; } elsif ($setting eq 'course') { $defaultrole = $env{'form.courserole'}; $defaultsec = $env{'form.sections'}; - } + } } elsif ($context eq 'author') { $defaultrole = $env{'form.defaultrole'}; } elsif ($context eq 'course') { $defaultrole = $env{'form.defaultrole'}; $defaultsec = $env{'form.sections'}; } - if ($env{'request.course.id'} ne '') { - $cid = $env{'request.course.id'}; - } elsif ($setting eq 'course') { - if (&Apache::lonnet::is_course($env{'form.dcdomain'},$env{'form.dccourse'})) { - $cid = $env{'form.dcdomain'}.'_'.$env{'form.dccourse'}; - } - } # Check to see if user information can be changed my @userinfo = ('firstname','middlename','lastname','generation', 'permanentemail','id'); @@ -3569,10 +3814,10 @@ sub upfile_drop_add { } my (%userlist,%modifiable_fields,@poss_roles); my $secidx = &Apache::loncoursedata::CL_SECTION(); - my @courseroles = &roles_by_context('course',1); + my @courseroles = &roles_by_context('course',1,$crstype); if (!&Apache::lonnet::allowed('mau',$domain)) { if ($context eq 'course' || $context eq 'author') { - @poss_roles = &curr_role_permissions($context); + @poss_roles = &curr_role_permissions($context,'','',$crstype); my @statuses = ('active','future'); my ($indexhash,$keylist) = &make_keylist_array(); my %info; @@ -3659,7 +3904,8 @@ sub upfile_drop_add { } my (%curr_rules,%got_rules,%alerts); my %customroles = &my_custom_roles(); - my @permitted_roles = &roles_on_upload($context,$setting,%customroles); + my @permitted_roles = + &roles_on_upload($context,$setting,$crstype,%customroles); # Get new users list foreach my $line (@userdata) { my @secs; @@ -3901,7 +4147,7 @@ sub upfile_drop_add { $role = 'cr_'.$env{'user.domain'}.'_'. $env{'user.name'}.'_'.$role; } - if ($role ne 'cc') { + if (($role ne 'cc') && ($role ne 'co')) { if (@secs > 1) { $multiple = 1; foreach my $sec (@secs) { @@ -4102,14 +4348,24 @@ sub user_change_result { # ========================================================= Menu Phase Two Drop sub print_drop_menu { - my ($r,$context,$permission) = @_; - $r->print('

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

'."\n". + my ($r,$context,$permission,$crstype) = @_; + my $heading; + if ($crstype eq 'Community') { + $heading = &mt("Drop Members"); + } else { + $heading = &mt("Drop Students"); + } + $r->print('

'.$heading.'

'."\n". ''."\n"); my $classlist = &Apache::loncoursedata::get_classlist(); if (! defined($classlist)) { - $r->print(&mt('There are no students currently enrolled.')."\n"); + if ($crstype eq 'Community') { + $r->print(&mt('There are no members currently enrolled.')."\n"); + } else { + $r->print(&mt('There are no students currently enrolled.')."\n"); + } } else { - &show_drop_list($r,$classlist,'nosort',$permission); + &show_drop_list($r,$classlist,'nosort',$permission,$crstype); } $r->print('
'. &Apache::loncommon::end_page()); return; @@ -4121,6 +4377,10 @@ sub update_user_list { my ($r,$context,$setting,$choice) = @_; my $now = time; my $count=0; + my $crstype; + if ($context eq 'course') { + $crstype = &Apache::loncommon::course_type(); + } my @changelist; if ($choice eq 'drop') { @changelist = &Apache::loncommon::get_env_multiple('form.droplist'); @@ -4191,7 +4451,7 @@ sub update_user_list { } } } - my $plrole = &Apache::lonnet::plaintext($role); + my $plrole = &Apache::lonnet::plaintext($role,$crstype); my $start = $env{'form.'.$item.'_start'}; my $end = $env{'form.'.$item.'_end'}; if ($choice eq 'drop') { @@ -4248,7 +4508,7 @@ sub update_user_list { } } elsif ($choice eq 'chgsec') { my (@newsecs,$revresult,$nochg,@retained); - if ($role ne 'cc') { + if (($role ne 'cc') && ($role ne 'co')) { @newsecs = split(/,/,$env{'form.newsecs'}); } # remove existing section if not to be retained. @@ -4356,7 +4616,7 @@ sub update_user_list { } if ($env{'form.makedatesdefault'}) { if ($choice eq 'chgdates' || $choice eq 'reenable' || $choice eq 'activate') { - $r->print(&make_dates_default($startdate,$enddate,$context)); + $r->print(&make_dates_default($startdate,$enddate,$context,$crstype)); } } my $linktext = &mt('Display User Lists'); @@ -4443,7 +4703,7 @@ sub course_sections { my $output = ''; my @sections = (sort {$a <=> $b} keys %{$sections_count}); my $numsec = scalar(@sections); - my $is_selected = ' selected="selected" '; + my $is_selected = ' selected="selected"'; if ($numsec <= 1) { $output = '