--- loncom/interface/courseprefs.pm 2013/04/08 23:57:21 1.55 +++ loncom/interface/courseprefs.pm 2013/04/11 15:30:37 1.56 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Handler to set configuration settings for a course # -# $Id: courseprefs.pm,v 1.55 2013/04/08 23:57:21 raeburn Exp $ +# $Id: courseprefs.pm,v 1.56 2013/04/11 15:30:37 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -317,6 +317,7 @@ sub handler { stul => 'Student agreement needed to be listed', clas => 'Classlists and staff listing', priv => 'Privileged users (Domain Coordinators) in staff listing', + prdo => "Domains to check for privileged users (besides course's domain)", defc => 'Default Course Spreadsheet', defs => 'Default Student Spreadsheet', seme => 'Send message to student when clicking Done on Tasks', @@ -424,12 +425,14 @@ sub handler { ordered => ['default_enrollment_start_date', 'default_enrollment_end_date', 'defaultcredits', - 'nothideprivileged','student_classlist_view', + 'nothideprivileged','checkforpriv', + 'student_classlist_view', 'student_classlist_opt_in','student_classlist_portfiles'], itemtext => { default_enrollment_start_date => 'Start date', default_enrollment_end_date => 'End date', nothideprivileged => $lt{'priv'}, + checkforpriv => $lt{'prdo'}, student_classlist_view => $lt{'stuv'}, student_classlist_opt_in => $lt{'stul'}, student_classlist_portfiles => 'Include link to accessible portfolio files', @@ -568,8 +571,15 @@ sub print_config_box { exists $item->{'header'}->[0]->{'col2'}) { $output .= ' - '.&mt($item->{'header'}->[0]->{'col1'}).' - '.&mt($item->{'header'}->[0]->{'col2'}).' + '.&mt($item->{'header'}->[0]->{'col1'}).''; + if ($action eq 'feedback') { + $output .= ' + '; + } else { + $output .= ' + '; + } + $output .= &mt($item->{'header'}->[0]->{'col2'}).' '; } $rowtotal ++; @@ -587,8 +597,14 @@ sub print_config_box { '; - $output .= ' - + if ($action eq 'classlists') { + $output .= ' + '; if ($action eq 'classlists') { $output .= &print_classlists('middle',$cdom,$settings,$itemtext,\$rowtotal,$crstype). @@ -617,8 +633,14 @@ sub print_config_box { exists $item->{'header'}->[0]->{'col2'}) { $output .= ' - - + '; + if (($action eq 'courseinfo') || ($action eq 'localization') || + ($action eq 'print_discussion')) { + $output .= ''; } } @@ -1104,32 +1126,43 @@ sub process_changes { my $newtext = $maxnum-1; $newhdr[$env{'form.printfmthdr_pos_'.$newtext}] = $env{'form.printfmthdr_text_'.$newtext}; $newvalues{$entry} = join('',@newhdr); - } elsif ($entry eq 'languages') { - my $langstr; + } elsif (($entry eq 'languages') || + ($entry eq 'checkforpriv')) { + my $settings; my $total = $env{'form.'.$entry.'_total'}; if ($total) { my @deletes = &Apache::loncommon::get_env_multiple('form.'.$entry.'_delete'); for (my $i=0; $i<$total; $i++) { unless (grep(/^$i$/,@deletes)) { - $langstr .= $env{'form.'.$entry.'_'.$i}.','; + $settings .= $env{'form.'.$entry.'_'.$i}.','; } } } else { $total = 0; } if ($env{'form.'.$entry.'_'.$total} ne '') { - my $newlang = $env{'form.'.$entry.'_'.$total}; - my %langchoices = &get_lang_choices(); - if ($langchoices{$newlang}) { - $langstr .= $newlang; + my $new = $env{'form.'.$entry.'_'.$total}; + if ($entry eq 'languages') { + my %langchoices = &get_lang_choices(); + if ($langchoices{$new}) { + $settings .= $new; + } else { + $settings =~ s/,$//; + $disallowed->{'localization'}{$entry} = $new; + } } else { - $langstr =~ s/,$//; - $disallowed->{'localization'}{$entry} = $newlang; + my %domains=map { $_ => 1; } &Apache::lonnet::all_domains(); + if ($domains{$new}) { + $settings .= $new; + } else { + $settings =~ s/,$//; + $disallowed->{'classlists'}{$entry} = $new; + } } } else { - $langstr =~ s/,$//; + $settings =~ s/,$//; } - $newvalues{$entry} = $langstr; + $newvalues{$entry} = $settings; } else { $newvalues{$entry} = $env{'form.'.$entry}; } @@ -1662,8 +1695,10 @@ function loncaparevinfo() { ENDSCRIPT } $jscript = ''."\n".$stubrowse_js."\n"; + $cloners_js."\n".'// ]]>'."\n". + ''."\n".$stubrowse_js."\n"; return $jscript; } @@ -1849,23 +1884,28 @@ sub print_courseinfo { my $datatable; my $count = 0; foreach my $item (@{$ordered}) { + my $colspan; if ($item eq 'hidefromcat') { next if (!$can_toggle_cat); } elsif ($item eq 'categories') { next if (!$can_categorize); } + unless (($item eq 'cloners') || ($item eq 'rolenames')) { + $colspan = 2; + } $count ++; if (exists $items{$item}{advanced} && $items{$item}{advanced} == 1) { - $datatable .= &item_table_row_start($items{$item}{text},$count,"advanced"); + $datatable .= &item_table_row_start($items{$item}{text},$count,"advanced",$colspan); } else { - $datatable .= &item_table_row_start($items{$item}{text},$count); + $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); } if ($items{$item}{input} eq 'radio') { $datatable .= &yesno_radio($item,$settings); } elsif ($item eq 'cloners') { my $includeempty = 1; my $num = 0; - $datatable .= &Apache::loncommon::start_data_table(). + $datatable .= ''. &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table(). - '
'.&mt($item->{'header'}->[1]->{'col1'}).''.&mt($item->{'header'}->[1]->{'col2'}).''; + } else { + $output .= ' + '; + } + $output .= &mt($item->{'header'}->[1]->{'col2'}).'
'.&mt($item->{'header'}->[0]->{'col1'}).''.&mt($item->{'header'}->[0]->{'col2'}).''.&mt($item->{'header'}->[0]->{'col1'}).''; + } else { + $output .= ''; + } + $output .= &mt($item->{'header'}->[0]->{'col2'}).'
'. + &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_row(). '
'.&mt('Or'). - '
'. + '
'.&mt('Or'). + '
'. &Apache::loncommon::start_data_table(); my @cloners; if ($settings->{$item} eq '') { @@ -1936,8 +1976,8 @@ sub print_courseinfo { ''. ''.&Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table(). - '
'.&mt('And'). - '
'. + '
'.&mt('And'). + '
'. &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_row(). ''. @@ -1948,7 +1988,8 @@ sub print_courseinfo { ''.&Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table(); } elsif ($item eq 'rolenames') { - $datatable .= &Apache::loncommon::start_data_table(); + $datatable .= ''. + &Apache::loncommon::start_data_table(); my @roles; if ($crstype eq 'Community') { @roles = ('co'); @@ -1968,7 +2009,7 @@ sub print_courseinfo { } $datatable .= &Apache::loncommon::end_data_table().''; } elsif ($item eq 'categories') { - my $launcher = 'onFocus="this.blur();javascript:catsbrowser();";'; + my $launcher = 'onfocus="this.blur();javascript:catsbrowser();"'; $datatable .= ''. &Apache::lonhtmlcommon::textbox($item.'_display',$settings->{$item}, $items{$item}{size},$launcher); @@ -2621,7 +2662,7 @@ sub get_param_description { sub show_autocoowners { my (@currcoown) = @_; - my $output = ''.&mt('Co-ownership is set automatically when a Course Coordinator role is assigned to official course personnel (from institutional data).').''; + my $output = ''.&mt('Co-ownership is set automatically when a Course Coordinator role[_1] is assigned to official course personnel (from institutional data).','
').'
'; if (@currcoown > 0) { $output .= '
'.&mt('Current co-owners are:').' '. join(', ',map { &Apache::loncommon::plainname(split(':',$_)); } (@currcoown)); @@ -2765,7 +2806,11 @@ sub print_localization { my $count = 0; foreach my $item (@{$ordered}) { $count ++; - $datatable .= &item_table_row_start($items{$item}{text},$count); + my $colspan; + unless ($item eq 'languages') { + $colspan = 2; + } + $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); if ($item eq 'timezone') { my $includeempty = 1; my $timezone = &Apache::lonlocal::gettimezone(); @@ -2784,12 +2829,13 @@ sub print_localization { undef,$includeempty); } else { if ($settings->{$item} eq '') { - $datatable .= + $datatable .= ''. &Apache::loncommon::select_language('languages_0','',1); } else { my $num = 0; my @languages = split(/\s*[,;:]\s*/,$settings->{$item}); - $datatable .= &Apache::loncommon::start_data_table(); + $datatable .= '
'. + &Apache::loncommon::start_data_table(); if (@languages > 0) { my %langchoices = &get_lang_choices(); foreach my $lang (@languages) { @@ -2816,7 +2862,7 @@ sub print_localization { &Apache::loncommon::select_language('languages_'.$num,'',1). ''. ''.&Apache::loncommon::end_data_table_row(). - &Apache::loncommon::end_data_table(); + &Apache::loncommon::end_data_table().'
'; } } $datatable .= &item_table_row_end(); @@ -2878,11 +2924,12 @@ sub print_feedback { if ($position eq 'top') { $datatable .= &item_table_row_start($items{$item}{text},$count); } else { - $datatable .= &item_table_row_start($items{$item}{text}."
(Custom text)",$count, "advanced"); + $datatable .= &item_table_row_start($items{$item}{text}."
(Custom text)",$count, "advanced",2); } if ($position eq 'top') { my $includeempty = 0; - $datatable .= &user_table($cdom,$item,\@sections, + $datatable .= ''. + &user_table($cdom,$item,\@sections, $settings->{$item},\%lt); } else { $datatable .= &Apache::lonhtmlcommon::textbox($item.'.text', @@ -2902,7 +2949,7 @@ sub user_table { } else { my $num = 0; my @curr = split(/,/,$currvalue); - $output .= ''; + $output .= '
'; my ($currusers); foreach my $val (@curr) { next if ($val eq ''); @@ -3066,34 +3113,43 @@ sub print_discussion { del => 'Delete?', sec => 'Sections:', ); - foreach my $item (@{$ordered}) { $count ++; - $datatable .= &item_table_row_start($items{$item}{text},$count); + my $colspan; + if ($item eq 'allow_limited_html_in_feedback') { + $colspan = 2; + } + $datatable .= &item_table_row_start($items{$item}{text},$count,undef,$colspan); if ($item eq 'plc.roles.denied') { - $datatable .= '
'.&role_checkboxes($cdom,$cnum,$item,$settings). + $datatable .= '
'. + ''.&role_checkboxes($cdom,$cnum,$item,$settings). '
'; } elsif ($item eq 'plc.users.denied') { - $datatable .= &user_table($cdom,$item,undef, + $datatable .= '
'. + &user_table($cdom,$item,undef, $settings->{$item},\%lt); } elsif ($item eq 'pch.roles.denied') { - $datatable .= ''.&role_checkboxes($cdom,$cnum,$item,$settings). + $datatable .= ''. &Apache::loncommon::end_data_table_row(). &role_checkboxes($cdom,$cnum,$item,$settings,1). - &Apache::loncommon::end_data_table(); + &Apache::loncommon::end_data_table().'
'; } elsif ($item eq 'discussion_post_fonts') { - $datatable .= &Apache::loncommon::start_data_table(). + $datatable .= ''. ''. @@ -3102,7 +3158,7 @@ sub print_discussion { ''. &Apache::loncommon::end_data_table_row(). &set_discussion_fonts($cdom,$cnum,$item,$settings). - &Apache::loncommon::end_data_table(); + &Apache::loncommon::end_data_table().'
'; } $datatable .= &item_table_row_end(); } @@ -3303,7 +3359,7 @@ sub print_classlists { push(@ordered,'defaultcredits'); } } elsif ($position eq 'middle') { - @ordered = ('nothideprivileged'); + @ordered = ('nothideprivileged','checkforpriv'); } else { @ordered = ('student_classlist_view', 'student_classlist_opt_in', @@ -3343,6 +3399,11 @@ sub print_classlists { input => 'checkbox', }, + 'checkforpriv' => { + text => ''.&mt($itemtext->{'checkforpriv'}).'', + input => 'selectbox', + }, + 'student_classlist_view' => { text => ''.&mt($itemtext->{'student_classlist_view'}).'', input => 'selectbox', @@ -3363,7 +3424,7 @@ sub print_classlists { ($settings->{'student_classlist_view'} eq 'section')) { $settings->{'student_classlist_view'} = 'disabled'; } - return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype); + return &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'classlists'); } sub print_appearance { @@ -3412,7 +3473,7 @@ sub print_appearance { size => 40, }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'appearance'); } sub print_grading { @@ -3468,7 +3529,7 @@ sub print_grading { input => 'radio', }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'grading'); } sub print_printouts { @@ -3521,7 +3582,7 @@ sub print_printouts { nullval => &mt('None specified - use domain default'), } ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'printouts'); } sub print_spreadsheet { @@ -3557,7 +3618,7 @@ sub print_spreadsheet { input => 'radio', }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'spreadsheet'); } sub print_bridgetasks { @@ -3599,7 +3660,7 @@ sub print_bridgetasks { input => 'radio', }, ); - return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype); + return &make_item_rows($cdom,\%items,$ordered,$settings,$rowtotal,$crstype,'bridgetasks'); } sub print_other { @@ -3624,7 +3685,7 @@ sub print_other { input => 'textbox', size => '30', }; - my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype); + my $output = &make_item_rows($cdom,\%items,\@ordered,$settings,$rowtotal,$crstype,'other'); } sub get_other_items { @@ -3651,13 +3712,18 @@ sub get_other_items { } sub item_table_row_start { - my ($text,$count,$add_class) = @_; + my ($text,$count,$add_class,$colspan) = @_; my $output; - my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row'; - $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); - $output .= ''."\n";; - $output .= ''."\n". + ''; + if ($colspan) { + $output .= '
'. + ''.&role_checkboxes($cdom,$cnum,$item,$settings). '
'; } elsif ($item eq 'pch.users.denied') { - $datatable .= &user_table($cdom,$item,undef, + $datatable .= '
'. + &user_table($cdom,$item,undef, $settings->{$item},\%lt); } elsif ($item eq 'allow_limited_html_in_feedback') { $datatable .= &yesno_radio($item,$settings); } elsif ($item eq 'allow_discussion_post_editing') { - $datatable .= &Apache::loncommon::start_data_table(). + $datatable .= '
'. + &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_row(). '
'.&mt('Role').''. &mt('Sections').'
'. + &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_row(). '
'.&mt('Sum of likes/dislikes').''.&mt('font-size').''.&mt('Other css').'
'.$text. - ''; + my $css_class = ($count % 2) ? 'LC_odd_row' : 'LC_even_row'; + $css_class = (join(' ',$css_class,$add_class)) unless ($add_class eq ''); + $output .= '
'.$text. + ''; + } else { + $output .= ''; + } return $output; } @@ -3728,16 +3794,21 @@ sub select_from_options { } sub make_item_rows { - my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype) = @_; + my ($cdom,$items,$ordered,$settings,$rowtotal,$crstype,$caller) = @_; my $datatable; if ((ref($items) eq 'HASH') && (ref($ordered) eq 'ARRAY')) { my $count = 0; foreach my $item (@{$ordered}) { $count ++; + my $colspan; + if ((($caller eq 'classlists') && ($item eq 'nothideprivileged')) || + (($caller eq 'printouts') && ($item ne 'print_header_format'))) { + $colspan = 2; + } if (exists $items->{$item}{advanced} && $items->{$item}{advanced} == 1) { - $datatable .= &item_table_row_start($items->{$item}{text},$count,"advanced"); + $datatable .= &item_table_row_start($items->{$item}{text},$count,"advanced",$colspan); } else { - $datatable .= &item_table_row_start($items->{$item}{text},$count); + $datatable .= &item_table_row_start($items->{$item}{text},$count,undef,$colspan); } if ($item eq 'defaultcredits') { my $defaultcredits = $env{'course.'.$env{'request.course.id'}.'.internal.defaultcredits'}; @@ -3750,6 +3821,8 @@ sub make_item_rows { $datatable .= $showcredits; } elsif ($item eq 'nothideprivileged') { $datatable .= ¬hidepriv_row($cdom,$item,$settings,$crstype); + } elsif ($item eq 'checkforpriv') { + $datatable .= &checkforpriv_row($cdom,$item,$settings,$crstype); } elsif ($item eq 'print_header_format') { $datatable .= &print_hdrfmt_row($item,$settings); } elsif ($items->{$item}{input} eq 'dates') { @@ -3781,8 +3854,7 @@ sub make_item_rows { sub nothidepriv_row { my ($cdom,$item,$settings,$crstype) = @_; my ($cnum) = &get_course(); - my %nothide; - my $datatable; + my ($datatable,%nothide,@checkdoms); if (ref($settings) eq 'HASH') { if ($settings->{$item} ne '') { foreach my $user (split(/\s*\,\s*/,$settings->{$item})) { @@ -3793,38 +3865,30 @@ sub nothidepriv_row { } } } + if ($settings->{'checkforpriv'}) { + @checkdoms = split(/,/,$settings->{'checkforpriv'}); + } } - my %coursepersonnel = &Apache::lonnet::dump('nohist_userroles',$cdom,$cnum); - my $now = time; + push(@checkdoms,$cdom); + my %coursepersonnel = + &Apache::lonnet::get_my_roles($cnum,$cdom,'',['previous','future','active']); my @privusers; - my %privileged; foreach my $person (keys(%coursepersonnel)) { - my ($role,$user,$usec) = ($person =~ /^([^:]*):([^:]+:[^:]+):([^:]*)/); - $user =~ s/:$//; - my ($end,$start) = split(/:/,$coursepersonnel{$person}); + my ($uname,$udom,$role) = split(/:/,$person); + my $user = $uname.':'.$udom; + my ($start,$end) = split(/:/,$coursepersonnel{$person}); if ($end == -1 || $start == -1) { next; } - my ($uname,$udom) = split(':',$user); - unless (ref($privileged{$udom}) eq 'HASH') { - my %dompersonnel = &Apache::lonnet::get_domain_roles($udom,['dc'],undef,$now); - $privileged{$udom} = {}; - if (keys(%dompersonnel)) { - foreach my $server (keys(%dompersonnel)) { - foreach my $user (sort(keys(%{$dompersonnel{$server}}))) { - my ($trole,$uname,$udom) = split(/:/,$user); - $privileged{$udom}{$uname} = $trole; - } + foreach my $dom (@checkdoms) { + if (&Apache::lonnet::privileged($uname,$udom,\@checkdoms,['dc','su'])) { + unless (grep(/^\Q$user\E$/,@privusers)) { + push(@privusers,$user); } } } - if (exists($privileged{$udom}{$uname})) { - unless (grep(/^\Q$user\E$/,@privusers)) { - push(@privusers,$user); - } - } } - if (@privusers) { + if (@privusers > 0) { $datatable .= ''; foreach my $user (sort(@privusers)) { my $hideon = ' checked="checked" '; @@ -3856,6 +3920,65 @@ sub nothidepriv_row { return $datatable; } +sub checkforpriv_row { + my ($cdom,$item,$settings,$crstype) = @_; + my $datatable; + my %domains=map { $_ => 1; } &Apache::lonnet::all_domains(); + if (keys(%domains) == 1) { + $datatable = ''. + &Apache::loncommon::end_data_table_row(); + $num ++; + unless (grep(/^\Q$currdom\E$/,@excdoms)) { + push(@excdoms,$currdom); + } + } + } + if ((scalar(keys(%domains)) - scalar(@excdoms)) > 0) { + $datatable .= + &Apache::loncommon::start_data_table_row(). + ''.&Apache::loncommon::end_data_table_row(); + } + $datatable .= &Apache::loncommon::end_data_table(). + ''. + '
'; + } + return $datatable; +} + sub print_hdrfmt_row { my ($item,$settings) = @_; my @curr; @@ -3928,7 +4051,8 @@ function getIndexByName(item) { ENDJS - $output .= $currstr.'
'. + &mt("Course's domain is only domain"); + return $datatable; + } + my @excdoms = ($cdom); + my $num = 0; + if ($settings->{$item} eq '') { + $datatable = ''. + &Apache::loncommon::select_dom_form('','checkforpriv_'.$num, + 1,1,undef,undef,\@excdoms); + } else { + my @privdoms = split(/,/,$settings->{$item}); + my %domains=map { $_ => 1; } &Apache::lonnet::all_domains(); + $datatable = '
'. + &Apache::loncommon::start_data_table(); + if (@privdoms > 0) { + foreach my $currdom (@privdoms) { + next unless ($domains{$currdom}); + my $domdesc = &Apache::lonnet::domain($currdom,'description'); + if ($domdesc eq '') { + $domdesc = $currdom; + } + $datatable .= + &Apache::loncommon::start_data_table_row(). + '
'. + &mt('Domain:').' '.$domdesc. + '
'. + '
'. + &mt('Additional domain:'). '
'. + &Apache::loncommon::select_dom_form('','checkforpriv_'.$num,1, + 1,undef,undef,\@excdoms). + '
'; + $output .= '

'. + $currstr.''; if (@curr > 0) { for (my $i=0; $i<@curr; $i++) { my $pos = $i+1; @@ -3968,7 +4092,7 @@ ENDJS ''. ''. - '
'; + '

'; return $output; }