--- loncom/interface/loncreateuser.pm 2012/02/06 04:50:52 1.358.4.1 +++ loncom/interface/loncreateuser.pm 2017/11/04 20:23:23 1.447 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.358.4.1 2012/02/06 04:50:52 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.447 2017/11/04 20:23:23 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -111,107 +111,125 @@ sub initialize_authen_forms { sub auth_abbrev { my %abv_auth = ( - krb5 => 'krb', - krb4 => 'krb', - internal => 'int', - localuth => 'loc', - unix => 'fsys', + krb5 => 'krb', + krb4 => 'krb', + internal => 'int', + localauth => 'loc', + unix => 'fsys', ); return %abv_auth; } # ==================================================== -sub portfolio_quota { +sub user_quotas { my ($ccuname,$ccdomain) = @_; my %lt = &Apache::lonlocal::texthash( 'usrt' => "User Tools", - 'disk' => "Disk space allocated to user's portfolio files", - 'cuqu' => "Current quota", 'cust' => "Custom quota", - 'defa' => "Default", 'chqu' => "Change quota", ); - my ($currquota,$quotatype,$inststatus,$defquota) = - &Apache::loncommon::get_user_quota($ccuname,$ccdomain); - my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($ccdomain); - my ($longinsttype,$showquota,$custom_on,$custom_off,$defaultinfo); - if ($inststatus ne '') { - if ($usertypes->{$inststatus} ne '') { - $longinsttype = $usertypes->{$inststatus}; - } - } - $custom_on = ' '; - $custom_off = ' checked="checked" '; + my $quota_javascript = <<"END_SCRIPT"; END_SCRIPT - if ($quotatype eq 'custom') { - $custom_on = $custom_off; - $custom_off = ' '; - $showquota = $currquota; - if ($longinsttype eq '') { - $defaultinfo = &mt('For this user, the default quota would be [_1]' - .' Mb.',$defquota); - } else { - $defaultinfo = &mt("For this user, the default quota would be [_1]". - " Mb, as determined by the user's institutional". - " affiliation ([_2]).",$defquota,$longinsttype); - } - } else { - if ($longinsttype eq '') { - $defaultinfo = &mt('For this user, the default quota is [_1]' - .' Mb.',$defquota); - } else { - $defaultinfo = &mt("For this user, the default quota of [_1]". - " Mb, is determined by the user's institutional". - " affiliation ([_2]).",$defquota,$longinsttype); - } - } - + my $longinsttype; + my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($ccdomain); my $output = $quota_javascript."\n". '

'.$lt{'usrt'}.'

'."\n". &Apache::loncommon::start_data_table(); - if (&Apache::lonnet::allowed('mut',$ccdomain)) { + if ((&Apache::lonnet::allowed('mut',$ccdomain)) || + (&Apache::lonnet::allowed('udp',$ccdomain))) { $output .= &build_tools_display($ccuname,$ccdomain,'tools'); } - if (&Apache::lonnet::allowed('mpq',$ccdomain)) { - $output .= ''."\n". - ' '.$lt{'disk'}.''."\n". - ' '."\n". - &Apache::loncommon::start_data_table_row()."\n". - ' '.$lt{'cuqu'}.': '. - $currquota.' Mb.  '. - $defaultinfo.''."\n". - &Apache::loncommon::end_data_table_row()."\n". - &Apache::loncommon::start_data_table_row()."\n". - ' '.$lt{'chqu'}. - ':  '. - '  '. - ' Mb'."\n". - &Apache::loncommon::end_data_table_row()."\n"; - } + + my %titles = &Apache::lonlocal::texthash ( + portfolio => "Disk space allocated to user's portfolio files", + author => "Disk space allocated to user's Authoring Space (if role assigned)", + ); + foreach my $name ('portfolio','author') { + my ($currquota,$quotatype,$inststatus,$defquota) = + &Apache::loncommon::get_user_quota($ccuname,$ccdomain,$name); + if ($longinsttype eq '') { + if ($inststatus ne '') { + if ($usertypes->{$inststatus} ne '') { + $longinsttype = $usertypes->{$inststatus}; + } + } + } + my ($showquota,$custom_on,$custom_off,$defaultinfo); + $custom_on = ' '; + $custom_off = ' checked="checked" '; + if ($quotatype eq 'custom') { + $custom_on = $custom_off; + $custom_off = ' '; + $showquota = $currquota; + if ($longinsttype eq '') { + $defaultinfo = &mt('For this user, the default quota would be [_1]' + .' MB.',$defquota); + } else { + $defaultinfo = &mt("For this user, the default quota would be [_1]". + " MB, as determined by the user's institutional". + " affiliation ([_2]).",$defquota,$longinsttype); + } + } else { + if ($longinsttype eq '') { + $defaultinfo = &mt('For this user, the default quota is [_1]' + .' MB.',$defquota); + } else { + $defaultinfo = &mt("For this user, the default quota of [_1]". + " MB, is determined by the user's institutional". + " affiliation ([_2]).",$defquota,$longinsttype); + } + } + + if (&Apache::lonnet::allowed('mpq',$ccdomain)) { + $output .= ''."\n". + ' '.$titles{$name}.''."\n". + ' '."\n". + &Apache::loncommon::start_data_table_row()."\n". + ' '. + &mt('Current quota: [_1] MB',$currquota).'  '. + $defaultinfo.''."\n". + &Apache::loncommon::end_data_table_row()."\n". + &Apache::loncommon::start_data_table_row()."\n". + ' '.$lt{'chqu'}. + ':  '. + '  '. + ' '.&mt('MB').''."\n". + &Apache::loncommon::end_data_table_row()."\n"; + } + } $output .= &Apache::loncommon::end_data_table(); return $output; } @@ -223,6 +241,7 @@ sub build_tools_display { my %lt = &Apache::lonlocal::texthash ( 'blog' => "Personal User Blog", 'aboutme' => "Personal Information Page", + 'webdav' => "WebDAV access to Authoring Spaces (if SSL and author/co-author)", 'portfolio' => "Personal User Portfolio", 'avai' => "Available", 'cusa' => "availability", @@ -232,12 +251,16 @@ sub build_tools_display { 'official' => 'Can request creation of official courses', 'unofficial' => 'Can request creation of unofficial courses', 'community' => 'Can request creation of communities', + 'textbook' => 'Can request creation of textbook courses', + 'placement' => 'Can request creation of placement tests', + 'requestauthor' => 'Can request author space', ); if ($context eq 'requestcourses') { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, 'requestcourses.official','requestcourses.unofficial', - 'requestcourses.community'); - @usertools = ('official','unofficial','community'); + 'requestcourses.community','requestcourses.textbook', + 'requestcourses.placement'); + @usertools = ('official','unofficial','community','textbook','placement'); @options =('norequest','approval','autolimit','validate'); %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain); %reqtitles = &courserequest_titles(); @@ -245,11 +268,22 @@ sub build_tools_display { $colspan = ' colspan="2"'; %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain); - $isadv = &Apache::lonnet::is_advanced_user($ccuname,$ccdomain); + $isadv = &Apache::lonnet::is_advanced_user($ccdomain,$ccuname); + } elsif ($context eq 'requestauthor') { + %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, + 'requestauthor'); + @usertools = ('requestauthor'); + @options =('norequest','approval','automatic'); + %reqtitles = &requestauthor_titles(); + %reqdisplay = &requestauthor_display(); + $colspan = ' colspan="2"'; + %domconfig = + &Apache::lonnet::get_dom('configuration',['requestauthor'],$ccdomain); } else { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, - 'tools.aboutme','tools.portfolio','tools.blog'); - @usertools = ('aboutme','blog','portfolio'); + 'tools.aboutme','tools.portfolio','tools.blog', + 'tools.webdav'); + @usertools = ('aboutme','blog','webdav','portfolio'); } foreach my $item (@usertools) { my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off, @@ -259,7 +293,12 @@ sub build_tools_display { $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item,undef, $context); - if ($userenv{$context.'.'.$item} ne '') { + if ($context eq 'requestauthor') { + if ($userenv{$context} ne '') { + $cust_on = ' checked="checked" '; + $cust_off = ''; + } + } elsif ($userenv{$context.'.'.$item} ne '') { $cust_on = ' checked="checked" '; $cust_off = ''; } @@ -269,6 +308,12 @@ sub build_tools_display { } else { $custom_access = &mt('Currently from custom setting.'); } + } elsif ($context eq 'requestauthor') { + if ($userenv{$context} eq '') { + $custom_access = &mt('Currently from default setting.'); + } else { + $custom_access = &mt('Currently from custom setting.'); + } } else { if ($userenv{$context.'.'.$item} eq '') { $custom_access = @@ -290,15 +335,28 @@ sub build_tools_display { ' '.$lt{$item}.''."\n". ' '."\n". &Apache::loncommon::start_data_table_row()."\n"; - if ($context eq 'requestcourses') { + + if (($context eq 'requestcourses') || ($context eq 'requestauthor')) { my ($curroption,$currlimit); - if ($userenv{$context.'.'.$item} ne '') { - $curroption = $userenv{$context.'.'.$item}; + my $envkey = $context.'.'.$item; + if ($context eq 'requestauthor') { + $envkey = $context; + } + if ($userenv{$envkey} ne '') { + $curroption = $userenv{$envkey}; } else { my (@inststatuses); - $curroption = - &Apache::loncoursequeueadmin::get_processtype($ccuname,$ccdomain,$isadv,$ccdomain, - $item,\@inststatuses,\%domconfig); + if ($context eq 'requestcourses') { + $curroption = + &Apache::loncoursequeueadmin::get_processtype('course',$ccuname,$ccdomain, + $isadv,$ccdomain,$item, + \@inststatuses,\%domconfig); + } else { + $curroption = + &Apache::loncoursequeueadmin::get_processtype('requestauthor',$ccuname,$ccdomain, + $isadv,$ccdomain,undef, + \@inststatuses,\%domconfig); + } } if (!$curroption) { $curroption = 'norequest'; @@ -336,35 +394,45 @@ sub build_tools_display { $checked = ' checked="checked"'; } } + my $name = 'crsreq_'.$item; + if ($context eq 'requestauthor') { + $name = $item; + } $custdisp .= ' '; if ($option eq 'autolimit') { - $custdisp .= '
'. $reqtitles{'unlimited'}; - } else { - $custdisp .= ''; - } - $custdisp .= ''; + } else { + $custdisp .= ''; + } + $custdisp .= ''; } $custdisp .= ''; $custradio = ''.&mt('Custom setting').'
'.$custdisp; } else { $currdisp = ($curr_access?&mt('Yes'):&mt('No')); + my $name = $context.'_'.$item; + if ($context eq 'requestauthor') { + $name = $context; + } $custdisp = '  '; $custradio = (' 'x2).'--'.$lt{'cusa'}.': '.$custdisp. ''; } $output .= ' '.$custom_access.(' 'x4). $lt{'avai'}.': '.$currdisp.''."\n". - &Apache::loncommon::end_data_table_row()."\n". + &Apache::loncommon::end_data_table_row()."\n"; + unless (&Apache::lonnet::allowed('udp',$ccdomain)) { + $output .= &Apache::loncommon::start_data_table_row()."\n". ' '. $lt{'chse'}.': '; + $output .= ' name="selfenroll_types_'.$num.'"'.$disabled.' />'.$usertypes->{$type}.''; } $count ++; } @@ -5259,7 +6637,7 @@ sub selfenroll_inst_types { } else { $output .= ' checked="checked"'; } - $output .= ' name="selfenroll_types_'.$num.'" />'.$othertitle.''; + $output .= ' name="selfenroll_types_'.$num.'"'.$disabled.' />'.$othertitle.''; } return $output; } @@ -5280,19 +6658,67 @@ sub selfenroll_date_forms { } sub print_userchangelogs_display { - my ($r,$context,$permission) = @_; - my $formname = 'roleslog'; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $crstype = &Apache::loncommon::course_type(); - my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum); + my ($r,$context,$permission,$brcrum) = @_; + my $formname = 'rolelog'; + my ($username,$domain,$crstype,$viewablesec,%roleslog); + if ($context eq 'domain') { + $domain = $env{'request.role.domain'}; + %roleslog=&Apache::lonnet::dump_dom('nohist_rolelog',$domain); + } else { + if ($context eq 'course') { + $domain = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $username = $env{'course.'.$env{'request.course.id'}.'.num'}; + $crstype = &Apache::loncommon::course_type(); + $viewablesec = &Apache::lonuserutils::viewable_section($permission); + my %saveable_parameters = ('show' => 'scalar',); + &Apache::loncommon::store_course_settings('roles_log', + \%saveable_parameters); + &Apache::loncommon::restore_course_settings('roles_log', + \%saveable_parameters); + } elsif ($context eq 'author') { + $domain = $env{'user.domain'}; + if ($env{'request.role'} =~ m{^au\./\Q$domain\E/$}) { + $username = $env{'user.name'}; + } else { + undef($domain); + } + } + if ($domain ne '' && $username ne '') { + %roleslog=&Apache::lonnet::dump('nohist_rolelog',$domain,$username); + } + } if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); } - my %saveable_parameters = ('show' => 'scalar',); - &Apache::loncommon::store_course_settings('roles_log', - \%saveable_parameters); - &Apache::loncommon::restore_course_settings('roles_log', - \%saveable_parameters); + my $helpitem; + if ($context eq 'course') { + $helpitem = 'Course_User_Logs'; + } elsif ($context eq 'domain') { + $helpitem = 'Domain_Role_Logs'; + } elsif ($context eq 'author') { + $helpitem = 'Author_User_Logs'; + } + push (@{$brcrum}, + {href => '/adm/createuser?action=changelogs', + text => 'User Management Logs', + help => $helpitem}); + my $bread_crumbs_component = 'User Changes'; + my $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + + # Create navigation javascript + my $jsnav = &userlogdisplay_js($formname); + + my $jscript = (< +// + +ENDSCRIPT + + # print page header + $r->print(&header($jscript,$args)); + # set defaults my $now = time(); my $defstart = $now - (7*24*3600); #7 days ago @@ -5325,7 +6751,9 @@ sub print_userchangelogs_display { my ($minshown,$maxshown); $minshown = 1; my $count = 0; - if ($curr{'show'} ne &mt('all')) { + if ($curr{'show'} =~ /\D/) { + $curr{'page'} = 1; + } else { $maxshown = $curr{'page'} * $curr{'show'}; if ($curr{'page'} > 1) { $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'}; @@ -5334,10 +6762,9 @@ sub print_userchangelogs_display { # Form Header $r->print('
'. - &role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype)); + &role_display_filter($context,$formname,$domain,$username,\%curr, + $version,$crstype)); - # Create navigation - my ($nav_script,$nav_links) = &userlogdisplay_nav($formname,\%curr,$more_records); my $showntableheader = 0; # Table Header @@ -5347,9 +6774,13 @@ sub print_userchangelogs_display { .''.&mt('When').'' .''.&mt('Who made the change').'' .''.&mt('Changed User').'' - .''.&mt('Role').'' - .''.&mt('Section').'' - .''.&mt('Context').'' + .''.&mt('Role').''; + + if ($context eq 'course') { + $tableheader .= ''.&mt('Section').''; + } + $tableheader .= + ''.&mt('Context').'' .''.&mt('Start').'' .''.&mt('End').'' .&Apache::loncommon::end_data_table_header_row(); @@ -5358,7 +6789,7 @@ sub print_userchangelogs_display { foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) { next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) || ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'})); - if ($curr{'show'} ne &mt('all')) { + if ($curr{'show'} !~ /\D/) { if ($count >= $curr{'page'} * $curr{'show'}) { $more_records = 1; last; @@ -5374,12 +6805,13 @@ sub print_userchangelogs_display { next if ($roleslog{$id}{'logentry'}{'context'} ne $curr{'chgcontext'}); } } + if (($context eq 'course') && ($viewablesec ne '')) { + next if ($roleslog{$id}{'logentry'}{'section'} ne $viewablesec); + } $count ++; next if ($count < $minshown); unless ($showntableheader) { - $r->print($nav_script - .$nav_links - .&Apache::loncommon::start_data_table() + $r->print(&Apache::loncommon::start_data_table() .$tableheader); $r->rflush(); $showntableheader = 1; @@ -5418,7 +6850,7 @@ sub print_userchangelogs_display { if ($roleslog{$id}{'logentry'}{'selfenroll'}) { $chgcontext = 'selfenroll'; } - my %lt = &rolechg_contexts($crstype); + my %lt = &rolechg_contexts($context,$crstype); if ($chgcontext ne '' && $lt{$chgcontext} ne '') { $chgcontext = $lt{$chgcontext}; } @@ -5428,17 +6860,20 @@ sub print_userchangelogs_display { .''.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).'' .''.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.'' .''.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.'' - .''.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).'' - .''.$sec.'' - .''.$chgcontext.'' + .''.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).''); + if ($context eq 'course') { + $r->print(''.$sec.''); + } + $r->print( + ''.$chgcontext.'' .''.$rolestart.'' .''.$roleend.'' .&Apache::loncommon::end_data_table_row()."\n"); } if ($showntableheader) { # Table footer, if content displayed above - $r->print(&Apache::loncommon::end_data_table() - .$nav_links); + $r->print(&Apache::loncommon::end_data_table(). + &userlogdisplay_navlinks(\%curr,$more_records)); } else { # No content displayed above $r->print('

' .&mt('There are no records to display.') @@ -5454,15 +6889,377 @@ sub print_userchangelogs_display { return; } -sub userlogdisplay_nav { - my ($formname,$curr,$more_records) = @_; - my ($nav_script,$nav_links); - if (ref($curr) eq 'HASH') { - # Create Navigation: - # Navigation Script - $nav_script = <<"ENDSCRIPT"; +sub print_useraccesslogs_display { + my ($r,$uname,$udom,$permission,$brcrum) = @_; + my $formname = 'accesslog'; + my $form = 'document.accesslog'; + +# set breadcrumbs + my %breadcrumb_text = &singleuser_breadcrumb('','domain',$udom); + my $prevphasestr; + if ($env{'form.popup'}) { + $brcrum = []; + } else { + push (@{$brcrum}, + {href => "javascript:backPage($form)", + text => $breadcrumb_text{'search'}}); + my @prevphases; + if ($env{'form.prevphases'}) { + @prevphases = split(/,/,$env{'form.prevphases'}); + $prevphasestr = $env{'form.prevphases'}; + } + if (($env{'form.phase'} eq 'userpicked') || (grep(/^userpicked$/,@prevphases))) { + push(@{$brcrum}, + {href => "javascript:backPage($form,'get_user_info','select')", + text => $breadcrumb_text{'userpicked'}}); + if ($env{'form.phase'} eq 'userpicked') { + $prevphasestr = 'userpicked'; + } + } + } + push(@{$brcrum}, + {href => '/adm/createuser?action=accesslogs', + text => 'User access logs', + help => 'Domain_User_Access_Logs'}); + my $bread_crumbs_component = 'User Access Logs'; + my $args = { bread_crumbs => $brcrum, + bread_crumbs_component => 'User Management'}; + if ($env{'form.popup'}) { + $args->{'no_nav_bar'} = 1; + $args->{'bread_crumbs_nomenu'} = 1; + } + +# set javascript + my ($jsback,$elements) = &crumb_utilities(); + my $jsnav = &userlogdisplay_js($formname); + + my $jscript = (< // + + +ENDSCRIPT + +# print page header + $r->print(&header($jscript,$args)); + +# early out unless log data can be displayed. + unless ($permission->{'activity'}) { + $r->print('

' + .&mt('You do not have rights to display user access logs.') + .'

'); + if ($env{'form.popup'}) { + $r->print('

'.&mt('Close window').'

'); + } else { + $r->print(&earlyout_accesslog_form($formname,$prevphasestr,$udom)); + } + return; + } + + unless ($udom eq $env{'request.role.domain'}) { + $r->print('

' + .&mt("User's domain must match role's domain") + .'

' + .&earlyout_accesslog_form($formname,$prevphasestr,$udom)); + return; + } + + if (($uname eq '') || ($udom eq '')) { + $r->print('

' + .&mt('Invalid username or domain') + .'

' + .&earlyout_accesslog_form($formname,$prevphasestr,$udom)); + return; + } + + if (&Apache::lonnet::privileged($uname,$udom, + [$env{'request.role.domain'}],['dc','su'])) { + unless (&Apache::lonnet::privileged($env{'user.name'},$env{'user.domain'}, + [$env{'request.role.domain'}],['dc','su'])) { + $r->print('

' + .&mt('You need to be a privileged user to display user access logs for [_1]', + &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom), + $uname,$udom)) + .'

'); + if ($env{'form.popup'}) { + $r->print('

'.&mt('Close window').'

'); + } else { + $r->print(&earlyout_accesslog_form($formname,$prevphasestr,$udom)); + } + return; + } + } + +# set defaults + my $now = time(); + my $defstart = $now - (7*24*3600); + my %defaults = ( + page => '1', + show => '10', + activity => 'any', + accesslog_start_date => $defstart, + accesslog_end_date => $now, + ); + my $more_records = 0; + +# set current + my %curr; + foreach my $item ('show','page','activity') { + $curr{$item} = $env{'form.'.$item}; + } + my ($startdate,$enddate) = + &Apache::lonuserutils::get_dates_from_form('accesslog_start_date','accesslog_end_date'); + $curr{'accesslog_start_date'} = $startdate; + $curr{'accesslog_end_date'} = $enddate; + foreach my $key (keys(%defaults)) { + if ($curr{$key} eq '') { + $curr{$key} = $defaults{$key}; + } + } + my ($minshown,$maxshown); + $minshown = 1; + my $count = 0; + if ($curr{'show'} =~ /\D/) { + $curr{'page'} = 1; + } else { + $maxshown = $curr{'page'} * $curr{'show'}; + if ($curr{'page'} > 1) { + $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'}; + } + } + +# form header + $r->print(''. + &activity_display_filter($formname,\%curr)); + + my $showntableheader = 0; + my ($nav_script,$nav_links); + +# table header + my $tableheader = '

'. + &mt('User access logs for: [_1]', + &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom)).'

' + .&Apache::loncommon::start_data_table_header_row() + .' ' + .''.&mt('When').'' + .''.&mt('HostID').'' + .''.&mt('Event').'' + .''.&mt('Other data').'' + .&Apache::loncommon::end_data_table_header_row(); + + my %filters=( + start => $curr{'accesslog_start_date'}, + end => $curr{'accesslog_end_date'}, + action => $curr{'activity'}, + ); + + my $reply = &Apache::lonnet::userlog_query($uname,$udom,%filters); + unless ( ($reply =~/^timeout/) || ($reply =~/^error/) ) { + my (%courses,%missing); + my @results = split(/\&/,$reply); + foreach my $item (reverse(@results)) { + my ($timestamp,$host,$event) = split(/:/,$item); + next unless ($event =~ /^(Log|Role)/); + if ($curr{'show'} !~ /\D/) { + if ($count >= $curr{'page'} * $curr{'show'}) { + $more_records = 1; + last; + } + } + $count ++; + next if ($count < $minshown); + unless ($showntableheader) { + $r->print($nav_script + .&Apache::loncommon::start_data_table() + .$tableheader); + $r->rflush(); + $showntableheader = 1; + } + my ($shown,$extra); + my ($event,$data) = split(/\s+/,&unescape($event),2); + if ($event eq 'Role') { + my ($rolecode,$extent) = split(/\./,$data,2); + next if ($extent eq ''); + my ($crstype,$desc,$info); + if ($extent =~ m{^/($match_domain)/($match_courseid)(?:/(\w+)|)$}) { + my ($cdom,$cnum,$sec) = ($1,$2,$3); + my $cid = $cdom.'_'.$cnum; + if (exists($courses{$cid})) { + $crstype = $courses{$cid}{'type'}; + $desc = $courses{$cid}{'description'}; + } elsif ($missing{$cid}) { + $crstype = 'Course'; + $desc = 'Course/Community'; + } else { + my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.',$cnum,undef,undef,'.'); + if (ref($crsinfo{$cdom.'_'.$cnum}) eq 'HASH') { + $courses{$cid} = $crsinfo{$cid}; + $crstype = $crsinfo{$cid}{'type'}; + $desc = $crsinfo{$cid}{'description'}; + } else { + $missing{$cid} = 1; + } + } + $extra = &mt($crstype).': '.$desc.''; + if ($sec ne '') { + $extra .= ' ('.&mt('Section: [_1]',$sec).')'; + } + } elsif ($extent =~ m{^/($match_domain)/($match_username|$)}) { + my ($dom,$name) = ($1,$2); + if ($rolecode eq 'au') { + $extra = ''; + } elsif ($rolecode =~ /^(ca|aa)$/) { + $extra = &mt('Authoring Space: [_1]',$name.':'.$dom); + } elsif ($rolecode =~ /^(li|dg|dh|dc|sc)$/) { + $extra = &mt('Domain: [_1]',$dom); + } + } + my $rolename; + if ($rolecode =~ m{^cr/($match_domain)/($match_username)/(\w+)}) { + my $role = $3; + my $owner = "($2:$1)"; + if ($2 eq $1.'-domainconfig') { + $owner = '(ad hoc)'; + } + $rolename = &mt('Custom role: [_1]',$role.' '.$owner); + } else { + $rolename = &Apache::lonnet::plaintext($rolecode,$crstype); + } + $shown = &mt('Role selection: [_1]',$rolename); + } else { + $shown = &mt($event); + if ($data =~ /^webdav/) { + my ($path,$clientip) = split(/\s+/,$data,2); + $path =~ s/^webdav//; + if ($clientip ne '') { + $extra = &mt('Client IP address: [_1]',$clientip); + } + if ($path ne '') { + $shown .= ' '.&mt('(WebDAV access to [_1])',$path); + } + } elsif ($data ne '') { + $extra = &mt('Client IP address: [_1]',$data); + } + } + $r->print( + &Apache::loncommon::start_data_table_row() + .''.$count.'' + .''.&Apache::lonlocal::locallocaltime($timestamp).'' + .''.$host.'' + .''.$shown.'' + .''.$extra.'' + .&Apache::loncommon::end_data_table_row()."\n"); + } + } + + if ($showntableheader) { # Table footer, if content displayed above + $r->print(&Apache::loncommon::end_data_table(). + &userlogdisplay_navlinks(\%curr,$more_records)); + } else { # No content displayed above + $r->print('

' + .&mt('There are no records to display.') + .'

'); + } + + if ($env{'form.popup'} == 1) { + $r->print(''."\n"); + } + + # Form Footer + $r->print( + '' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'
'); + return; +} + +sub earlyout_accesslog_form { + my ($formname,$prevphasestr,$udom) = @_; + my $srchterm = &HTML::Entities::encode($env{'form.srchterm'},'<>"&'); + return <<"END"; +
+ + + + + + + + + +
+END +} + +sub activity_display_filter { + my ($formname,$curr) = @_; + my $nolink = 1; + my $output = ''; + my $startform = + &Apache::lonhtmlcommon::date_setter($formname,'accesslog_start_date', + $curr->{'accesslog_start_date'},undef, + undef,undef,undef,undef,undef,undef,$nolink); + my $endform = + &Apache::lonhtmlcommon::date_setter($formname,'accesslog_end_date', + $curr->{'accesslog_end_date'},undef, + undef,undef,undef,undef,undef,undef,$nolink); + my %lt = &Apache::lonlocal::texthash ( + activity => 'Activity', + Role => 'Role selection', + log => 'Log-in or Logout', + ); + $output .= ''. + ''. + ''. + '
'. + ''.&mt('Actions/page:').'
'. + &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + (&mt('all'),5,10,20,50,100,1000,10000)). + '
  '.&mt('Window during which actions occurred:').'
'. + ''. + ''. + '
'.&mt('After:'). + ''.$startform.'
'.&mt('Before:').''.$endform.'
'. + '
  '.&mt('Activities').'
'. + '
'; + # Update Display button + $output .= '

' + .'' + .'


'; + return $output; +} + +sub userlogdisplay_js { + my ($formname) = @_; + return <<"ENDSCRIPT"; + function chgPage(caller) { if (caller == 'previous') { document.$formname.page.value --; @@ -5473,34 +7270,38 @@ function chgPage(caller) { document.$formname.submit(); return; } -// ]]> - ENDSCRIPT - # Navigation Buttons - $nav_links = '

'; - if (($curr->{'page'} > 1) || ($more_records)) { - if ($curr->{'page'} > 1) { - $nav_links .= ' '; - } - if ($more_records) { - $nav_links .= ''; - } +} + +sub userlogdisplay_navlinks { + my ($curr,$more_records) = @_; + return unless(ref($curr) eq 'HASH'); + # Navigation Buttons + my $nav_links = '

'; + if (($curr->{'page'} > 1) || ($more_records)) { + if (($curr->{'page'} > 1) && ($curr->{'show'} !~ /\D/)) { + $nav_links .= ' '; + } + if ($more_records) { + $nav_links .= ''; } - $nav_links .= '

'; } - return ($nav_script,$nav_links); + $nav_links .= '

'; + return $nav_links; } sub role_display_filter { - my ($formname,$cdom,$cnum,$curr,$version,$crstype) = @_; - my $context = 'course'; - my $lctype = lc($crstype); + my ($context,$formname,$cdom,$cnum,$curr,$version,$crstype) = @_; + my $lctype; + if ($context eq 'course') { + $lctype = lc($crstype); + } my $nolink = 1; my $output = ''."\n"; } else { $row .= ''."\n"; + 'name="sec_'.$protectedcourse.'_'.$role.'" />'."\n"; } } $row .= <'. @@ -6227,7 +9103,11 @@ sub course_level_dc { ''; my $courseform=&Apache::loncommon::selectcourse_link ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Select','crstype'); - my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser'); + my $credit_elem; + if ($showcredits) { + $credit_elem = 'credits'; + } + my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser',$credit_elem); my %lt=&Apache::lonlocal::texthash( 'rol' => "Role", 'grs' => "Section", @@ -6237,39 +9117,47 @@ sub course_level_dc { 'end' => "End", 'ssd' => "Set Start Date", 'sed' => "Set End Date", - 'scc' => "Course/Community" + 'scc' => "Course/Community", + 'crd' => "Credits", ); my $header = '

'.&mt('Course/Community Level').'

'. &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). - '
'. + ''."\n". + ''."\n"; + $header .= ''."\n" if ($showcredits); + $header .= ''."\n". &Apache::loncommon::end_data_table_header_row(); my $otheritems = &Apache::loncommon::start_data_table_row()."\n". ''."\n". - ''; + '
'. ''.&mt('Changes/page:').'
'. @@ -5515,7 +7316,7 @@ sub role_display_filter { &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date', $curr->{'rolelog_end_date'},undef, undef,undef,undef,undef,undef,undef,$nolink); - my %lt = &rolechg_contexts($crstype); + my %lt = &rolechg_contexts($context,$crstype); $output .= '
'.&mt('Window during which changes occurred:').'
'. ''. @@ -5529,7 +7330,7 @@ sub role_display_filter { $output .= ' selected="selected"'; } $output .= '>'.&mt('Any').''."\n"; - my @roles = &Apache::lonuserutils::course_roles($context,undef,1,$lctype); + my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype); foreach my $role (@roles) { my $plrole; if ($role eq 'cr') { @@ -5547,13 +7348,23 @@ sub role_display_filter { ''. ''. + &Apache::loncommon::end_data_table_header_row(); + foreach my $priv (sort(keys(%{$full}))) { + next unless ($levels->{'course'}{$priv}); + my $privtext = &Apache::lonnet::plaintext($priv,$crstype); + my ($default,$ineffect); + if ($levelscurrent->{'course'}{$priv}) { + $default = ''.$lt{'ena'}.''; + $ineffect = $default; + } + my ($customstatus,$checked); + $output .= &Apache::loncommon::start_data_table_row(). + ''. + ''. + &Apache::loncommon::end_data_table_row(); + } + $output .= &Apache::loncommon::end_data_table(); + return $output; +} + +sub get_adhocrole_settings { + my ($cid,$accesstypes,$types,$customroles,$settings,$overridden) = @_; + return unless ((ref($accesstypes) eq 'ARRAY') && (ref($customroles) eq 'HASH') && + (ref($settings) eq 'HASH') && (ref($overridden) eq 'HASH')); + foreach my $role (split(/,/,$env{'course.'.$cid.'.internal.adhocaccess'})) { + my ($curraccess,$rest) = split(/=/,$env{'course.'.$cid.'.internal.adhoc.'.$role}); + if (($curraccess ne '') && (grep(/^\Q$curraccess\E$/,@{$accesstypes}))) { + $settings->{$role}{'access'} = $curraccess; + if (($curraccess eq 'status') && (ref($types) eq 'ARRAY')) { + my @status = split(/,/,$rest); + my @currstatus; + foreach my $type (@status) { + if ($type eq 'default') { + push(@currstatus,$type); + } elsif (grep(/^\Q$type\E$/,@{$types})) { + push(@currstatus,$type); + } + } + if (@currstatus) { + $settings->{$role}{$curraccess} = \@currstatus; + } elsif (($curraccess eq 'exc') || ($curraccess eq 'inc')) { + my @personnel = split(/,/,$rest); + $settings->{$role}{$curraccess} = \@personnel; + } + } + } + } + foreach my $role (keys(%{$customroles})) { + if ($env{'course.'.$cid.'.internal.adhocpriv.'.$role}) { + my %currentprivs; + if (ref($customroles->{$role}) eq 'HASH') { + if (exists($customroles->{$role}{'course'})) { + my %full=(); + my %levels= ( + course => {}, + domain => {}, + system => {}, + ); + my %levelscurrent=( + course => {}, + domain => {}, + system => {}, + ); + &Apache::lonuserutils::custom_role_privs($customroles->{$role},\%full,\%levels,\%levelscurrent); + %currentprivs = %{$levelscurrent{'course'}}; + } + } + foreach my $item (split(/,/,$env{'course.'.$cid.'.internal.adhocpriv.'.$role})) { + next if ($item eq ''); + my ($rule,$rest) = split(/=/,$item); + next unless (($rule eq 'off') || ($rule eq 'on')); + foreach my $priv (split(/:/,$rest)) { + if ($priv ne '') { + if ($rule eq 'off') { + push(@{$overridden->{$role}{'off'}},$priv); + if ($currentprivs{$priv}) { + push(@{$settings->{$role}{'off'}},$priv); + } + } else { + push(@{$overridden->{$role}{'on'}},$priv); + unless ($currentprivs{$priv}) { + push(@{$settings->{$role}{'on'}},$priv); + } + } + } + } + } + } + } + return; +} + +sub update_helpdeskaccess { + my ($r,$permission,$brcrum) = @_; + my $helpitem = 'Course_Helpdesk_Access'; + push (@{$brcrum}, + {href => '/adm/createuser?action=helpdesk', + text => 'Helpdesk Access', + help => $helpitem}, + {href => '/adm/createuser?action=helpdesk', + text => 'Result', + help => $helpitem} + ); + my $bread_crumbs_component = 'Helpdesk Staff Access'; + my $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + + # print page header + $r->print(&header('',$args)); + unless ((ref($permission) eq 'HASH') && ($permission->{'owner'})) { + $r->print('

'.&mt('You do not have permission to change helpdesk access.').'

'); + return; + } + my @accesstypes = ('all','dh','da','none','status','inc','exc'); + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $confname = $cdom.'-domainconfig'; + my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($cdom); + my $crstype = &Apache::loncommon::course_type(); + my %customroles = &get_domain_customroles($cdom,$confname); + my (%settings,%overridden); + &get_adhocrole_settings($env{'request.course.id'},\@accesstypes, + $types,\%customroles,\%settings,\%overridden); + my %domhelpdesk = &Apache::lonnet::get_active_domroles($cdom,['dh','da']); + my (%changed,%storehash,@todelete); + + if (keys(%customroles)) { + my (%newsettings,@incrs); + foreach my $role (keys(%customroles)) { + $newsettings{$role} = { + access => '', + status => '', + exc => '', + inc => '', + on => '', + off => '', + }; + my %current; + if (ref($settings{$role}) eq 'HASH') { + %current = %{$settings{$role}}; + } + if (ref($overridden{$role}) eq 'HASH') { + $current{'overridden'} = $overridden{$role}; + } + if ($env{'form.'.$role.'_incrs'}) { + my $access = $env{'form.'.$role.'_access'}; + if (grep(/^\Q$access\E$/,@accesstypes)) { + push(@incrs,$role); + unless ($current{'access'} eq $access) { + $changed{$role}{'access'} = 1; + $storehash{'internal.adhoc.'.$role} = $access; + } + if ($access eq 'status') { + my @statuses = &Apache::loncommon::get_env_multiple('form.'.$role.'_status'); + my @stored; + my @shownstatus; + if (ref($types) eq 'ARRAY') { + foreach my $type (sort(@statuses)) { + if ($type eq 'default') { + push(@stored,$type); + } elsif (grep(/^\Q$type\E$/,@{$types})) { + push(@stored,$type); + push(@shownstatus,$usertypes->{$type}); + } + } + if (grep(/^default$/,@statuses)) { + push(@shownstatus,$othertitle); + } + $storehash{'internal.adhoc.'.$role} .= '='.join(',',@stored); + } + $newsettings{$role}{'status'} = join(' '.&mt('or').' ',@shownstatus); + if (ref($current{'status'}) eq 'ARRAY') { + my @diffs = &Apache::loncommon::compare_arrays(\@stored,$current{'status'}); + if (@diffs) { + $changed{$role}{'status'} = 1; + } + } elsif (@stored) { + $changed{$role}{'status'} = 1; + } + } elsif (($access eq 'inc') || ($access eq 'exc')) { + my @personnel = &Apache::loncommon::get_env_multiple('form.'.$role.'_staff_'.$access); + my @newspecstaff; + my @stored; + my @currstaff; + foreach my $person (sort(@personnel)) { + if ($domhelpdesk{$person}) { + push(@stored,$person); + } + } + if (ref($current{$access}) eq 'ARRAY') { + my @diffs = &Apache::loncommon::compare_arrays(\@stored,$current{$access}); + if (@diffs) { + $changed{$role}{$access} = 1; + } + } elsif (@stored) { + $changed{$role}{$access} = 1; + } + $storehash{'internal.adhoc.'.$role} .= '='.join(',',@stored); + foreach my $person (@stored) { + my ($uname,$udom) = split(/:/,$person); + push(@newspecstaff,&Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom,'lastname'),$uname,$udom)); + } + $newsettings{$role}{$access} = join(', ',sort(@newspecstaff)); + } + $newsettings{$role}{'access'} = $access; + } + } else { + if (($current{'access'} ne '') && (grep(/^\Q$current{'access'}\E$/,@accesstypes))) { + $changed{$role}{'access'} = 1; + $newsettings{$role} = {}; + push(@todelete,'internal.adhoc.'.$role); + } + } + if (($env{'form.'.$role.'_incrs'}) && ($env{'form.'.$role.'_access'} eq 'none')) { + if (ref($current{'overridden'}) eq 'HASH') { + push(@todelete,'internal.adhocpriv.'.$role); + } + } else { + my %full=(); + my %levels= ( + course => {}, + domain => {}, + system => {}, + ); + my %levelscurrent=( + course => {}, + domain => {}, + system => {}, + ); + &Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent); + my (@updatedon,@updatedoff,@override); + @override = &Apache::loncommon::get_env_multiple('form.'.$role.'_override'); + if (@override) { + foreach my $priv (sort(keys(%full))) { + next unless ($levels{'course'}{$priv}); + if (grep(/^\Q$priv\E$/,@override)) { + if ($levelscurrent{'course'}{$priv}) { + push(@updatedoff,$priv); + } else { + push(@updatedon,$priv); + } + } + } + } + if (@updatedon) { + $newsettings{$role}{'on'} = join('
  • ', map { &Apache::lonnet::plaintext($_,$crstype) } (@updatedon)); + } + if (@updatedoff) { + $newsettings{$role}{'off'} = join('
  • ', map { &Apache::lonnet::plaintext($_,$crstype) } (@updatedoff)); + } + if (ref($current{'overridden'}) eq 'HASH') { + if (ref($current{'overridden'}{'on'}) eq 'ARRAY') { + if (@updatedon) { + my @diffs = &Apache::loncommon::compare_arrays(\@updatedon,$current{'overridden'}{'on'}); + if (@diffs) { + $changed{$role}{'on'} = 1; + } + } else { + $changed{$role}{'on'} = 1; + } + } elsif (@updatedon) { + $changed{$role}{'on'} = 1; + } + if (ref($current{'overridden'}{'off'}) eq 'ARRAY') { + if (@updatedoff) { + my @diffs = &Apache::loncommon::compare_arrays(\@updatedoff,$current{'overridden'}{'off'}); + if (@diffs) { + $changed{$role}{'off'} = 1; + } + } else { + $changed{$role}{'off'} = 1; + } + } elsif (@updatedoff) { + $changed{$role}{'off'} = 1; + } + } else { + if (@updatedon) { + $changed{$role}{'on'} = 1; + } + if (@updatedoff) { + $changed{$role}{'off'} = 1; + } + } + if (ref($changed{$role}) eq 'HASH') { + if (($changed{$role}{'on'} || $changed{$role}{'off'})) { + my $newpriv; + if (@updatedon) { + $newpriv = 'on='.join(':',@updatedon); + } + if (@updatedoff) { + $newpriv .= ($newpriv ? ',' : '' ).'off='.join(':',@updatedoff); + } + if ($newpriv eq '') { + push(@todelete,'internal.adhocpriv.'.$role); + } else { + $storehash{'internal.adhocpriv.'.$role} = $newpriv; + } + } + } + } + } + if (@incrs) { + $storehash{'internal.adhocaccess'} = join(',',@incrs); + } elsif (@todelete) { + push(@todelete,'internal.adhocaccess'); + } + if (keys(%changed)) { + my ($putres,$delres); + if (keys(%storehash)) { + $putres = &Apache::lonnet::put('environment',\%storehash,$cdom,$cnum); + my %newenvhash; + foreach my $key (keys(%storehash)) { + $newenvhash{'course.'.$env{'request.course.id'}.'.'.$key} = $storehash{$key}; + } + &Apache::lonnet::appenv(\%newenvhash); + } + if (@todelete) { + $delres = &Apache::lonnet::del('environment',\@todelete,$cdom,$cnum); + foreach my $key (@todelete) { + &Apache::lonnet::delenv('course.'.$env{'request.course.id'}.'.'.$key); + } + } + if (($putres eq 'ok') || ($delres eq 'ok')) { + my %domconfig = &Apache::lonnet::get_dom('configuration',['helpsettings'],$cdom); + my (%domcurrent,%ordered,%description,%domusage); + if (ref($domconfig{'helpsettings'}) eq 'HASH') { + if (ref($domconfig{'helpsettings'}{'adhoc'}) eq 'HASH') { + %domcurrent = %{$domconfig{'helpsettings'}{'adhoc'}}; + } + } + my $count = 0; + foreach my $role (sort(keys(%customroles))) { + my ($order,$desc); + if (ref($domcurrent{$role}) eq 'HASH') { + $order = $domcurrent{$role}{'order'}; + $desc = $domcurrent{$role}{'desc'}; + } + if ($order eq '') { + $order = $count; + } + $ordered{$order} = $role; + if ($desc ne '') { + $description{$role} = $desc; + } else { + $description{$role}= $role; + } + $count++; + } + my @roles_by_num = (); + foreach my $item (sort {$a <=> $b } (keys(%ordered))) { + push(@roles_by_num,$ordered{$item}); + } + %domusage = &domain_adhoc_access(\%changed,\%domcurrent,\@accesstypes,$usertypes,$othertitle); + $r->print(&mt('Helpdesk access settings have been changed as follows').'
    '); + $r->print('
      '); + foreach my $role (@roles_by_num) { + next unless (ref($changed{$role}) eq 'HASH'); + $r->print('
    • '.&mt('Ad hoc role').': '.$description{$role}.''. + '
        '); + if ($changed{$role}{'access'} || $changed{$role}{'status'} || $changed{$role}{'inc'} || $changed{$role}{'exc'}) { + $r->print('
      • '); + if ($env{'form.'.$role.'_incrs'}) { + if ($newsettings{$role}{'access'} eq 'all') { + $r->print(&mt('All helpdesk staff can access '.lc($crstype).' with this role.')); + } elsif ($newsettings{$role}{'access'} eq 'dh') { + $r->print(&mt('Helpdesk staff can use this role if they have an active [_1] role', + &Apache::lonnet::plaintext('dh'))); + } elsif ($newsettings{$role}{'access'} eq 'da') { + $r->print(&mt('Helpdesk staff can use this role if they have an active [_1] role', + &Apache::lonnet::plaintext('da'))); + } elsif ($newsettings{$role}{'access'} eq 'none') { + $r->print(&mt('No helpdesk staff can access '.lc($crstype).' with this role.')); + } elsif ($newsettings{$role}{'access'} eq 'status') { + if ($newsettings{$role}{'status'}) { + my ($access,$rest) = split(/=/,$storehash{'internal.adhoc.'.$role}); + if (split(/,/,$rest) > 1) { + $r->print(&mt('Helpdesk staff can use this role if their institutional type is one of: [_1].', + $newsettings{$role}{'status'})); + } else { + $r->print(&mt('Helpdesk staff can use this role if their institutional type is: [_1].', + $newsettings{$role}{'status'})); + } + } else { + $r->print(&mt('No helpdesk staff can access '.lc($crstype).' with this role.')); + } + } elsif ($newsettings{$role}{'access'} eq 'exc') { + if ($newsettings{$role}{'exc'}) { + $r->print(&mt('Helpdesk staff who can use this role are as follows:').' '.$newsettings{$role}{'exc'}.'.'); + } else { + $r->print(&mt('No helpdesk staff can access '.lc($crstype).' with this role.')); + } + } elsif ($newsettings{$role}{'access'} eq 'inc') { + if ($newsettings{$role}{'inc'}) { + $r->print(&mt('All helpdesk staff may use this role except the following:').' '.$newsettings{$role}{'inc'}.'.'); + } else { + $r->print(&mt('All helpdesk staff may use this role.')); + } + } + } else { + $r->print(&mt('Default access set in the domain now applies.').'
        '. + ''.$domusage{$role}.''); + } + $r->print('
      • '); + } + unless ($newsettings{$role}{'access'} eq 'none') { + if ($changed{$role}{'off'}) { + if ($newsettings{$role}{'off'}) { + $r->print('
      • '.&mt('Privileges which are available by default for this ad hoc role, but are disabled for this specific '.lc($crstype).':'). + '
        • '.$newsettings{$role}{'off'}.'
      • '); + } else { + $r->print('
      • '.&mt('All privileges available by default for this ad hoc role are enabled.').'
      • '); + } + } + if ($changed{$role}{'on'}) { + if ($newsettings{$role}{'on'}) { + $r->print('
      • '.&mt('Privileges which are not available by default for this ad hoc role, but are enabled for this specific '.lc($crstype).':'). + '
        • '.$newsettings{$role}{'on'}.'
      • '); + } else { + $r->print('
      • '.&mt('None of the privileges unavailable by default for this ad hoc role are enabled.').'
      • '); + } + } + } + $r->print('
    • '); + } + $r->print('
    '); + } + } else { + $r->print(&mt('No changes made to helpdesk access settings.')); + } + } + return; } #-------------------------------------------------- functions for &phase_two @@ -5622,9 +8437,7 @@ sub user_search_result { if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'instd')) { if (($srch->{'srchdomain'} eq '') || ! (&Apache::lonnet::domain($srch->{'srchdomain'}))) { - $response = '

    '. - &mt('You must specify a valid domain when searching in a domain or institutional directory.'). - '

    '; + $response = &mt('You must specify a valid domain when searching in a domain or institutional directory.') } } if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs') || @@ -5637,20 +8450,34 @@ sub user_search_result { } } if ($unamecheck !~ /^$match_username$/) { - $response = '

    '. - &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @'). - '

    '; + $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @'); } } } if ($response ne '') { - $response = ''.$response.''; + $response = ''.$response.'
    '; } if ($srch->{'srchin'} eq 'instd') { - my $instd_chk = &directorysrch_check($srch); + my $instd_chk = &instdirectorysrch_check($srch); if ($instd_chk ne 'ok') { - $response = ''.$instd_chk.''. - '
    '.&mt('You may want to search in the LON-CAPA domain instead of the institutional directory.').'

    '; + my $domd_chk = &domdirectorysrch_check($srch); + $response .= ''.$instd_chk.'
    '; + if ($domd_chk eq 'ok') { + $response .= &mt('You may want to search in the LON-CAPA domain instead of in the institutional directory.'); + } + $response .= '
    '; + } + } else { + unless (($context eq 'requestcrs') && ($srch->{'srchtype'} eq 'exact')) { + my $domd_chk = &domdirectorysrch_check($srch); + if (($domd_chk ne 'ok') && ($env{'form.action'} ne 'accesslogs')) { + my $instd_chk = &instdirectorysrch_check($srch); + $response .= ''.$domd_chk.'
    '; + if ($instd_chk eq 'ok') { + $response .= &mt('You may want to search in the institutional directory instead of in the LON-CAPA domain.'); + } + $response .= '
    '; + } } } if ($response ne '') { @@ -5680,6 +8507,9 @@ sub user_search_result { &build_search_response($context,$srch,%srch_results); } else { $currstate = 'modify'; + if ($env{'form.action'} eq 'accesslogs') { + $currstate = 'activity'; + } my $uname = $srch->{'srchterm'}; my $udom = $srch->{'srchdomain'}; $srch_results{$uname.':'.$udom} = @@ -5745,8 +8575,8 @@ sub user_search_result { $response = ''. &mt('Institutional directory search is not available in domain: [_1]',$showdom). '
    '. - &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.'). - '

    '; + &mt('You may want to search in the LON-CAPA domain instead of in the institutional directory.'). + '
    '; } } } else { @@ -5818,15 +8648,34 @@ sub user_search_result { $response = ''. &mt('Institutional directory search is not available in domain: [_1]',$showdom). '
    '. - &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.'). - '

    '; + &mt('You may want to search in the LON-CAPA domain instead of in the institutional directory.'). + '
    '; } } } return ($currstate,$response,$forcenewuser,\%srch_results); } -sub directorysrch_check { +sub domdirectorysrch_check { + my ($srch) = @_; + my $response; + my %dom_inst_srch = &Apache::lonnet::get_dom('configuration', + ['directorysrch'],$srch->{'srchdomain'}); + my $showdom = &display_domain_info($srch->{'srchdomain'}); + if (ref($dom_inst_srch{'directorysrch'}) eq 'HASH') { + if ($dom_inst_srch{'directorysrch'}{'lcavailable'} eq '0') { + return &mt('LON-CAPA directory search is not available in domain: [_1]',$showdom); + } + if ($dom_inst_srch{'directorysrch'}{'lclocalonly'}) { + if ($env{'request.role.domain'} ne $srch->{'srchdomain'}) { + return &mt('LON-CAPA directory search in domain: [_1] is only allowed for users with a current role in the domain.',$showdom); + } + } + } + return 'ok'; +} + +sub instdirectorysrch_check { my ($srch) = @_; my $can_search = 0; my $response; @@ -5948,7 +8797,11 @@ sub build_search_response { $currstate = 'select'; } else { if (keys(%srch_results) == 1) { - $currstate = 'modify'; + if ($env{'form.action'} eq 'accesslogs') { + $currstate = 'activity'; + } else { + $currstate = 'modify'; + } $response = &mt("$single{$srch->{'srchtype'}} was found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}.",$srch->{'srchterm'}); if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') { $response .= ': '.&display_domain_info($srch->{'srchdomain'}); @@ -5968,7 +8821,7 @@ sub build_search_response { if ($srch->{'srchin'} ne 'alc') { $forcenewuser = 1; my $cansrchinst = 0; - if ($srch->{'srchdomain'}) { + if (($srch->{'srchdomain'}) && ($env{'form.action'} ne 'accesslogs')) { my %domconfig = &Apache::lonnet::get_dom('configuration',['directorysrch'],$srch->{'srchdomain'}); if (ref($domconfig{'directorysrch'}) eq 'HASH') { if ($domconfig{'directorysrch'}{'available'}) { @@ -5993,7 +8846,8 @@ sub build_search_response { $createdom = $env{'form.coursedom'}; } } - if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $createdom)) { + unless (($env{'form.action'} eq 'accesslogs') || (($srch->{'srchby'} eq 'uname') && ($srch->{'srchin'} eq 'dom') && + ($srch->{'srchtype'} eq 'exact') && ($srch->{'srchdomain'} eq $createdom))) { my $cancreate = &Apache::lonuserutils::can_create_user($createdom,$context); my $targetdom = ''.$createdom.''; @@ -6017,18 +8871,20 @@ sub build_search_response { .&mt("Click 'Search'") .'

  • '; } else { - my $helplink = ' href="javascript:helpMenu('."'display'".')"'; - $response .= '

    '; - if ($context eq 'requestcrs') { - $response .= &mt("You are not authorized to define new users in the new course's domain - [_1].",$targetdom); - } else { - $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom); + unless (($context eq 'domain') && ($env{'form.action'} eq 'singleuser')) { + my $helplink = ' href="javascript:helpMenu('."'display'".')"'; + $response .= '

    '; + if ($context eq 'requestcrs') { + $response .= &mt("You are not authorized to define new users in the new course's domain - [_1].",$targetdom); + } else { + $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom); + } + $response .= '
    ' + .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.' + ,' ' + ,'') + .'
    '; } - $response .= '
    ' - .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.' - ,' ' - ,'') - .'

    '; } } } @@ -6095,7 +8951,8 @@ function backPage(formname,prevphase,pre } sub course_level_table { - my (%inccourses) = @_; + my ($inccourses,$showcredits,$defaultcredits) = @_; + return unless (ref($inccourses) eq 'HASH'); my $table = ''; # Custom Roles? @@ -6110,15 +8967,16 @@ sub course_level_table { 'rol' => "Role", 'ext' => "Extent", 'grs' => "Section", + 'crd' => "Credits", 'sta' => "Start", 'end' => "End" ); - foreach my $protectedcourse (sort(keys(%inccourses))) { + foreach my $protectedcourse (sort(keys(%{$inccourses}))) { my $thiscourse=$protectedcourse; $thiscourse=~s:_:/:g; my %coursedata=&Apache::lonnet::coursedescription($thiscourse); - my $isowner = &is_courseowner($protectedcourse,$coursedata{'internal.courseowner'}); + my $isowner = &Apache::lonuserutils::is_courseowner($protectedcourse,$coursedata{'internal.courseowner'}); my $area=$coursedata{'description'}; my $crstype=$coursedata{'type'}; if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; } @@ -6136,12 +8994,14 @@ sub course_level_table { if ((&Apache::lonnet::allowed('c'.$role,$thiscourse)) || ((($role eq 'cc') || ($role eq 'co')) && ($isowner))) { $table .= &course_level_row($protectedcourse,$role,$area,$domain, - $plrole,\%sections_count,\%lt); + $plrole,\%sections_count,\%lt, + $showcredits,$defaultcredits,$crstype); } elsif ($env{'request.course.sec'} ne '') { if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'. $env{'request.course.sec'})) { $table .= &course_level_row($protectedcourse,$role,$area,$domain, - $plrole,\%sections_count,\%lt); + $plrole,\%sections_count,\%lt, + $showcredits,$defaultcredits,$crstype); } } } @@ -6150,7 +9010,8 @@ sub course_level_table { next if ($crstype eq 'Community' && $customroles{$cust} =~ /bre\&S/); my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust; $table .= &course_level_row($protectedcourse,$role,$area,$domain, - $cust,\%sections_count,\%lt); + $cust,\%sections_count,\%lt, + $showcredits,$defaultcredits,$crstype); } } } @@ -6163,8 +9024,14 @@ sub course_level_table { $result .= &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). -'
    -'. +''."\n". +''; + } + $result .= +''."\n". +''. &Apache::loncommon::end_data_table_header_row(). $table. &Apache::loncommon::end_data_table(); @@ -6172,12 +9039,21 @@ $table. } sub course_level_row { - my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,$lt) = @_; + my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count, + $lt,$showcredits,$defaultcredits,$crstype) = @_; + my $creditem; my $row = &Apache::loncommon::start_data_table_row(). ' '."\n". ' '."\n". ' '."\n"; + if (($showcredits) && ($role eq 'st') && ($crstype eq 'Course')) { + $row .= + ''; + } else { + $row .= ''; + } if (($role eq 'cc') || ($role eq 'co')) { $row .= ''; } elsif ($env{'request.course.sec'} ne '') { @@ -6203,7 +9079,7 @@ sub course_level_row { '
    '.&mt('After:'). ''.$startform.'
      '. &mt('Context:').'
    '. + ''); + } else { + if ($env{'course.'.$env{'request.course.id'}.'.internal.courseowner'}) { + my ($ownername,$ownerdom) = split(/:/,$env{'course.'.$env{'request.course.id'}.'.internal.courseowner'}); + $r->print('
    '.&mt('The course owner -- [_1] -- can override the default access and/or privileges for these ad hoc roles.', + &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($ownername,$ownerdom),$ownername,$ownerdom))); + } + $disabled = ' disabled="disabled"'; + } + $r->print('

    '); + + $r->print('
      '); + my $count = 0; + my %visibility; + foreach my $role (@roles_by_num) { + my $id; + if ($count == 0) { + $id=' id="LC_current_minitab"'; + $visibility{$role} = ' style="display:block"'; + } else { + $visibility{$role} = ' style="display:none"'; + } + $count ++; + $r->print(''.$description{$role}.''); + } + $r->print('
    '); + + foreach my $role (@roles_by_num) { + my %usecheck = ( + all => ' checked="checked"', + ); + my %displaydiv = ( + status => 'none', + inc => 'none', + exc => 'none', + priv => 'block', + ); + my (%selected,$overridden,$incrscheck,$indomcheck,$indomvis,$incrsvis); + if (ref($settings{$role}) eq 'HASH') { + if ($settings{$role}{'access'} ne '') { + $indomvis = ' style="display:none"'; + $incrsvis = ' style="display:block"'; + $incrscheck = ' checked="checked"'; + if ($settings{$role}{'access'} ne 'all') { + $usecheck{$settings{$role}{'access'}} = $usecheck{'all'}; + delete($usecheck{'all'}); + if ($settings{$role}{'access'} eq 'status') { + my $access = 'status'; + $displaydiv{$access} = 'inline'; + if (ref($settings{$role}{$access}) eq 'ARRAY') { + $selected{$access} = $settings{$role}{$access}; + } + } elsif ($settings{$role}{'access'} =~ /^(inc|exc)$/) { + my $access = $1; + $displaydiv{$access} = 'inline'; + if (ref($settings{$role}{$access}) eq 'ARRAY') { + $selected{$access} = $settings{$role}{$access}; + } + } elsif ($settings{$role}{'access'} eq 'none') { + $displaydiv{'priv'} = 'none'; + } + } + } else { + $indomcheck = ' checked="checked"'; + $indomvis = ' style="display:block"'; + $incrsvis = ' style="display:none"'; + } + } else { + $indomcheck = ' checked="checked"'; + $indomvis = ' style="display:block"'; + $incrsvis = ' style="display:none"'; + } + $r->print('
    '. + '
    '.$lt{'rou'}.''. + '

    '.$lt{'whi'}.' '. + ''. + ''.(' 'x2). + '

    '. + '
    '. + ''.$domusage{$role}.'
    '. + '
    '); + foreach my $access (@accesstypes) { + $r->print('

    '); + if ($access eq 'status') { + $r->print('

    '. + &Apache::lonuserutils::adhoc_status_types($cdom,undef,$role,$selected{$access}, + $othertitle,$usertypes,$types,$disabled). + '
    '); + } elsif (($access eq 'inc') && (keys(%domhelpdesk) > 0)) { + $r->print('
    '. + &Apache::lonuserutils::adhoc_staff($access,undef,$role,$selected{$access}, + \%domhelpdesk,$disabled). + '
    '); + } elsif (($access eq 'exc') && (keys(%domhelpdesk) > 0)) { + $r->print('
    '. + &Apache::lonuserutils::adhoc_staff($access,undef,$role,$selected{$access}, + \%domhelpdesk,$disabled). + '
    '); + } + $r->print('

    '); + } + $r->print('
    '); + my %full=(); + my %levels= ( + course => {}, + domain => {}, + system => {}, + ); + my %levelscurrent=( + course => {}, + domain => {}, + system => {}, + ); + &Apache::lonuserutils::custom_role_privs($customroles{$role},\%full,\%levels,\%levelscurrent); + $r->print('
    '. + ''.$lt{'rpr'}.''. + &role_priv_table($role,$permission,$crstype,\%full,\%levels,\%levelscurrent,$overridden{$role}). + '
    '); + } + if ($permission->{'owner'}) { + $r->print('

    '); + } + } else { + $r->print(&mt('Helpdesk roles have not yet been created in this domain.')); + } + # Form Footer + $r->print('' + .''); + return; +} + +sub domain_adhoc_access { + my ($roles,$domcurrent,$accesstypes,$usertypes,$othertitle) = @_; + my %domusage; + return unless ((ref($roles) eq 'HASH') && (ref($domcurrent) eq 'HASH') && (ref($accesstypes) eq 'ARRAY')); + foreach my $role (keys(%{$roles})) { + if (ref($domcurrent->{$role}) eq 'HASH') { + my $access = $domcurrent->{$role}{'access'}; + if (($access eq '') || (!grep(/^\Q$access\E$/,@{$accesstypes}))) { + $access = 'all'; + $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role',&Apache::lonnet::plaintext('dh'), + &Apache::lonnet::plaintext('da')); + } elsif ($access eq 'status') { + if (ref($domcurrent->{$role}{$access}) eq 'ARRAY') { + my @shown; + foreach my $type (@{$domcurrent->{$role}{$access}}) { + unless ($type eq 'default') { + if ($usertypes->{$type}) { + push(@shown,$usertypes->{$type}); + } + } + } + if (grep(/^default$/,@{$domcurrent->{$role}{$access}})) { + push(@shown,$othertitle); + } + if (@shown) { + my $shownstatus = join(' '.&mt('or').' ',@shown); + $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role, and institutional status: [_3]', + &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'),$shownstatus); + } else { + $domusage{$role} = &mt('No one in the domain'); + } + } + } elsif ($access eq 'inc') { + my @dominc = (); + if (ref($domcurrent->{$role}{'inc'}) eq 'ARRAY') { + foreach my $user (@{$domcurrent->{$role}{'inc'}}) { + my ($uname,$udom) = split(/:/,$user); + push(@dominc,&Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom)); + } + my $showninc = join(', ',@dominc); + if ($showninc ne '') { + $domusage{$role} = &mt('Include any user in domain with active [_1] or [_2] role, except: [_3]', + &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'),$showninc); + } else { + $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role', + &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da')); + } + } + } elsif ($access eq 'exc') { + my @domexc = (); + if (ref($domcurrent->{$role}{'exc'}) eq 'ARRAY') { + foreach my $user (@{$domcurrent->{$role}{'exc'}}) { + my ($uname,$udom) = split(/:/,$user); + push(@domexc,&Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom)); + } + } + my $shownexc = join(', ',@domexc); + if ($shownexc ne '') { + $domusage{$role} = &mt('Only the following in the domain with active [_1] or [_2] role: [_3]', + &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da'),$shownexc); + } else { + $domusage{$role} = &mt('No one in the domain'); + } + } elsif ($access eq 'none') { + $domusage{$role} = &mt('No one in the domain'); + } elsif ($access eq 'dh') { + $domusage{$role} = &mt('Any user in domain with active [_1] role',&Apache::lonnet::plaintext('dh')); + } elsif ($access eq 'da') { + $domusage{$role} = &mt('Any user in domain with active [_1] role',&Apache::lonnet::plaintext('da')); + } elsif ($access eq 'all') { + $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role', + &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da')); + } + } else { + $domusage{$role} = &mt('Any user in domain with active [_1] or [_2] role', + &Apache::lonnet::plaintext('dh'),&Apache::lonnet::plaintext('da')); + } + } + return %domusage; +} + +sub get_domain_customroles { + my ($cdom,$confname) = @_; + my %existing=&Apache::lonnet::dump('roles',$cdom,$confname,'rolesdef_'); + my %customroles; + foreach my $key (keys(%existing)) { + if ($key=~/^rolesdef\_(\w+)$/) { + my $rolename = $1; + my %privs; + ($privs{'system'},$privs{'domain'},$privs{'course'}) = split(/\_/,$existing{$key}); + $customroles{$rolename} = \%privs; + } + } + return %customroles; +} + +sub role_priv_table { + my ($role,$permission,$crstype,$full,$levels,$levelscurrent,$overridden) = @_; + return unless ((ref($full) eq 'HASH') && (ref($levels) eq 'HASH') && + (ref($levelscurrent) eq 'HASH')); + my %lt=&Apache::lonlocal::texthash ( + 'crl' => 'Course Level Privilege', + 'def' => 'Domain Defaults', + 'ove' => 'Override in Course', + 'ine' => 'In effect', + 'dis' => 'Disabled', + 'ena' => 'Enabled', + ); if ($crstype eq 'Community') { - $lt{'createcourse'} = &mt('Community Creation'); - $lt{'course'} = &mt('User Management in community'); - $lt{'requestcourses'} = &mt('Community Request'); + $lt{'ove'} = 'Override in Community', } - return %lt; + my @status = ('Disabled','Enabled'); + my (%on,%off); + if (ref($overridden) eq 'HASH') { + if (ref($overridden->{'on'}) eq 'ARRAY') { + map { $on{$_} = 1; } (@{$overridden->{'on'}}); + } + if (ref($overridden->{'off'}) eq 'ARRAY') { + map { $off{$_} = 1; } (@{$overridden->{'off'}}); + } + } + my $output=&Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(). + '
    '.$lt{'crl'}.''.$lt{'def'}.''.$lt{'ove'}. + ''.$lt{'ine'}.''.$privtext.''.$default.''; + if (($levelscurrent->{'course'}{$priv}) && ($off{$priv})) { + if ($permission->{'owner'}) { + $checked = ' checked="checked"'; + } + $customstatus = ''.$lt{'dis'}.''; + $ineffect = $customstatus; + } elsif ((!$levelscurrent->{'course'}{$priv}) && ($on{$priv})) { + if ($permission->{'owner'}) { + $checked = ' checked="checked"'; + } + $customstatus = ''.$lt{'ena'}.''; + $ineffect = $customstatus; + } + if ($permission->{'owner'}) { + $output .= ''; + } else { + $output .= $customstatus; + } + $output .= ''.$ineffect.''.$lt{'act'}.''.$lt{'rol'}.''.$lt{'ext'}.''.$lt{'grs'}.''.$lt{'sta'}.''.$lt{'end'}.''.$lt{'act'}.''.$lt{'rol'}.''.$lt{'ext'}.''."\n"; + if ($showcredits) { + $result .= $lt{'crd'}.''.$lt{'grs'}.''.$lt{'sta'}.''.$lt{'end'}.''.$plrole.''.$area.'
    Domain: '.$domain.'
      
    '.$lt{'scc'}.''.$lt{'rol'}.''.$lt{'grs'}.''.$lt{'sta'}.''.$lt{'end'}.''.$lt{'scc'}.''.$lt{'rol'}.''.$lt{'grs'}.''.$lt{'crd'}.''.$lt{'sta'}.''.$lt{'end'}.'
    '. $courseform.(' ' x4).'


    '. ''. ''. + ' '. ''. ''. - '
    '.$lt{'exs'}.'
       '.$lt{'new'}.'
    '. ''. ''. ''. '
    '."\n"; + if ($showcredits) { + $otheritems .= '
    '."\n". + ''."\n"; + } $otheritems .= <
    {'selfenroll_'.$type.'_date'}; $newenrolldate{$type} = &Apache::lonhtmlcommon::get_date_from_form('selfenroll_'.$type.'_date'); if ($newenrolldate{$type} ne $currenrolldate{$type}) { $changes{'internal.selfenroll_'.$type.'_date'} = $newenrolldate{$type}; @@ -6305,15 +9197,14 @@ sub update_selfenroll_config { } elsif ($item eq 'access_dates') { my (%currdate,%newdate); foreach my $type ('start','end') { - $currdate{$type} = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$type.'_access'}; + $currdate{$type} = $currsettings->{'selfenroll_'.$type.'_access'}; $newdate{$type} = &Apache::lonhtmlcommon::get_date_from_form('selfenroll_'.$type.'_access'); if ($newdate{$type} ne $currdate{$type}) { $changes{'internal.selfenroll_'.$type.'_access'} = $newdate{$type}; } } } elsif ($item eq 'types') { - $curr_types = - $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item}; + $curr_types = $currsettings->{'selfenroll_'.$item}; if ($env{'form.selfenroll_all'}) { if ($curr_types ne '*') { $changes{'internal.selfenroll_types'} = '*'; @@ -6382,9 +9273,9 @@ sub update_selfenroll_config { my $newlimit = $env{'form.selfenroll_limit'}; my $newcap = $env{'form.selfenroll_cap'}; $newcap =~s/\s+//g; - my $currlimit = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_limit'}; + my $currlimit = $currsettings->{'selfenroll_limit'}; $currlimit = 'none' if ($currlimit eq ''); - my $currcap = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_cap'}; + my $currcap = $currsettings->{'selfenroll_cap'}; if ($newlimit ne $currlimit) { if ($newlimit ne 'none') { if ($newcap =~ /^\d+$/) { @@ -6393,7 +9284,8 @@ sub update_selfenroll_config { } $changes{'internal.selfenroll_limit'} = $newlimit; } else { - $warning{$item} = &mt('Maximum enrollment setting unchanged.').'
    '.&mt('The value provided was invalid - it must be a positive integer if enrollment is being limited.'); + $warning{$item} = &mt('Maximum enrollment setting unchanged.').'
    '. + &mt('The value provided was invalid - it must be a positive integer if enrollment is being limited.'); } } elsif ($currcap ne '') { $changes{'internal.selfenroll_cap'} = ''; @@ -6405,13 +9297,14 @@ sub update_selfenroll_config { $changes{'internal.selfenroll_cap'} = $newcap; } } else { - $warning{$item} = &mt('Maximum enrollment setting unchanged.').'
    '.&mt('The value provided was invalid - it must be a positive integer if enrollment is being limited.'); + $warning{$item} = &mt('Maximum enrollment setting unchanged.').'
    '. + &mt('The value provided was invalid - it must be a positive integer if enrollment is being limited.'); } } } elsif ($item eq 'approval') { my (@currnotified,@newnotified); - my $currapproval = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}; - my $currnotifylist = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_notifylist'}; + my $currapproval = $currsettings->{'selfenroll_approval'}; + my $currnotifylist = $currsettings->{'selfenroll_notifylist'}; if ($currnotifylist ne '') { @currnotified = split(/,/,$currnotifylist); @currnotified = sort(@currnotified); @@ -6447,14 +9340,14 @@ sub update_selfenroll_config { } } } else { - my $curr_val = - $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_'.$item}; + my $curr_val = $currsettings->{'selfenroll_'.$item}; my $newval = $env{'form.selfenroll_'.$item}; if ($item eq 'section') { $newval = $env{'form.sections'}; if (defined($curr_groups{$newval})) { $newval = $curr_val; - $warning{$item} = &mt('Section for self-enrolled users unchanged as the proposed section is a group').'
    '.&mt('Group names and section names must be distinct'); + $warning{$item} = &mt('Section for self-enrolled users unchanged as the proposed section is a group').'
    '. + &mt('Group names and section names must be distinct'); } elsif ($newval eq 'all') { $newval = $curr_val; $warning{$item} = &mt('Section for self-enrolled users unchanged, as "all" is a reserved section name.'); @@ -6484,11 +9377,10 @@ sub update_selfenroll_config { my %crsinfo = &Apache::lonnet::courseiddump($cdom,'.',1,'.','.', $cnum,undef,undef,'Course'); my $chome = &Apache::lonnet::homeserver($cnum,$cdom); - if (ref($crsinfo{$env{'request.course.id'}}) eq 'HASH') { + if (ref($crsinfo{$cid}) eq 'HASH') { foreach my $item ('selfenroll_types','selfenroll_start_date','selfenroll_end_date') { if (exists($changes{'internal.'.$item})) { - $crsinfo{$env{'request.course.id'}}{$item} = - $changes{'internal.'.$item}; + $crsinfo{$cid}{$item} = $changes{'internal.'.$item}; } } my $crsputresult = @@ -6525,7 +9417,7 @@ sub update_selfenroll_config { if ($changes{'internal.selfenroll_cap'} ne '') { $newcap = $changes{'internal.selfenroll_cap'} } else { - $newcap = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_cap'}; + $newcap = $currsettings->{'selfenroll_cap'}; } if ($changes{'internal.selfenroll_limit'} eq 'none') { $newval = &mt('No limit'); @@ -6535,7 +9427,7 @@ sub update_selfenroll_config { } elsif ($changes{'internal.selfenroll_limit'} eq 'selfenrolled') { $newval = &mt('New self-enrollment no longer allowed when total number of self-enrolled students reaches [_1].',$newcap); } else { - my $currlimit = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_limit'}; + my $currlimit = $currsettings->{'selfenroll_limit'}; if ($currlimit eq 'allstudents') { $newval = &mt('New self-enrollment no longer allowed when total (all students) reaches [_1].',$newcap); } elsif ($changes{'internal.selfenroll_limit'} eq 'selfenrolled') { @@ -6547,24 +9439,24 @@ sub update_selfenroll_config { } elsif ($item eq 'approval') { if ((exists($changes{'internal.selfenroll_approval'})) || (exists($changes{'internal.selfenroll_notifylist'}))) { + my %selfdescs = &Apache::lonuserutils::selfenroll_default_descs(); my ($newval,$newnotify); if (exists($changes{'internal.selfenroll_notifylist'})) { $newnotify = $changes{'internal.selfenroll_notifylist'}; } else { - $newnotify = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_notifylist'}; + $newnotify = $currsettings->{'selfenroll_notifylist'}; } - if ($changes{'internal.selfenroll_approval'}) { - $newval = &mt('Yes'); - } elsif ($changes{'internal.selfenroll_approval'} eq '0') { - $newval = &mt('No'); + if (exists($changes{'internal.selfenroll_approval'})) { + if ($changes{'internal.selfenroll_approval'} !~ /^[012]$/) { + $changes{'internal.selfenroll_approval'} = '0'; + } + $newval = $selfdescs{'approval'}{$changes{'internal.selfenroll_approval'}}; } else { - my $currapproval = - $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}; - if ($currapproval) { - $newval = &mt('Yes'); - } else { - $newval = &mt('No'); + my $currapproval = $currsettings->{'selfenroll_approval'}; + if ($currapproval !~ /^[012]$/) { + $currapproval = 0; } + $newval = $selfdescs{'approval'}{$currapproval}; } $r->print('
  • '.&mt('"[_1]" set to "[_2]".',$title,$newval)); if ($newnotify) { @@ -6595,13 +9487,16 @@ sub update_selfenroll_config { } } $r->print(''); - my %newenvhash; - foreach my $key (keys(%changes)) { - $newenvhash{'course.'.$env{'request.course.id'}.'.'.$key} = $changes{$key}; + if ($env{'course.'.$cid.'.description'} ne '') { + my %newenvhash; + foreach my $key (keys(%changes)) { + $newenvhash{'course.'.$cid.'.'.$key} = $changes{$key}; + } + &Apache::lonnet::appenv(\%newenvhash); } - &Apache::lonnet::appenv(\%newenvhash); } else { - $r->print(&mt('An error occurred when saving changes to self-enrollment settings in this course.').'
    '.&mt('The error was: [_1].',$putresult)); + $r->print(&mt('An error occurred when saving changes to self-enrollment settings in this course.').'
    '. + &mt('The error was: [_1].',$putresult)); } } else { $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.')); @@ -6609,54 +9504,54 @@ sub update_selfenroll_config { } else { $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.')); } - my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum); - if (ref($visactions) eq 'HASH') { - if (!$visible) { - $r->print('
    '.$visactions->{'miss'}.'
    '.$visactions->{'yous'}. - '
    '); - if (ref($vismsgs) eq 'ARRAY') { - $r->print('
    '.$visactions->{'take'}.'
      '); - foreach my $item (@{$vismsgs}) { - $r->print('
    • '.$visactions->{$item}.'
    • '); + my $visactions = &cat_visibility(); + my ($cathash,%cattype); + my %domconfig = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); + if (ref($domconfig{'coursecategories'}) eq 'HASH') { + $cathash = $domconfig{'coursecategories'}{'cats'}; + $cattype{'auth'} = $domconfig{'coursecategories'}{'auth'}; + $cattype{'unauth'} = $domconfig{'coursecategories'}{'unauth'}; + } else { + $cathash = {}; + $cattype{'auth'} = 'std'; + $cattype{'unauth'} = 'std'; + } + if (($cattype{'auth'} eq 'none') && ($cattype{'unauth'} eq 'none')) { + $r->print('
      '.$visactions->{'miss'}.'
      '.$visactions->{'yous'}. + '
      '. + '
      '.$visactions->{'take'}.'
        '. + '
      • '.$visactions->{'dc_chgconf'}.'
      • '. + '
      '); + } elsif (($cattype{'auth'} !~ /^(std|domonly)$/) && ($cattype{'unauth'} !~ /^(std|domonly)$/)) { + if ($currsettings->{'uniquecode'}) { + $r->print(''.$visactions->{'vis'}.''); + } else { + $r->print('
      '.$visactions->{'miss'}.'
      '.$visactions->{'yous'}. + '
      '. + '
      '.$visactions->{'take'}.'
        '. + '
      • '.$visactions->{'dc_setcode'}.'
      • '. + '

      '); + } + } else { + my ($visible,$cansetvis,$vismsgs) = &visible_in_stdcat($cdom,$cnum,\%domconfig); + if (ref($visactions) eq 'HASH') { + if (!$visible) { + $r->print('
      '.$visactions->{'miss'}.'
      '.$visactions->{'yous'}. + '
      '); + if (ref($vismsgs) eq 'ARRAY') { + $r->print('
      '.$visactions->{'take'}.'
        '); + foreach my $item (@{$vismsgs}) { + $r->print('
      • '.$visactions->{$item}.'
      • '); + } + $r->print('
      '); } - $r->print('
    '); + $r->print($cansetvis); } - $r->print($cansetvis); } } return; } -sub get_selfenroll_titles { - my @row = ('types','registered','enroll_dates','access_dates','section', - 'approval','limit'); - my %lt = &Apache::lonlocal::texthash ( - types => 'Users allowed to self-enroll in this course', - registered => 'Restrict self-enrollment to students officially registered for the course', - enroll_dates => 'Dates self-enrollment available', - access_dates => 'Course access dates assigned to self-enrolling users', - section => 'Section assigned to self-enrolling users', - approval => 'Self-enrollment requests need approval?', - limit => 'Enrollment limit', - ); - return (\@row,\%lt); -} - -sub is_courseowner { - my ($thiscourse,$courseowner) = @_; - if ($courseowner eq '') { - if ($env{'request.course.id'} eq $thiscourse) { - $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'}; - } - } - if ($courseowner ne '') { - if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) { - return 1; - } - } - return; -} - #---------------------------------------------- end functions for &phase_two #--------------------------------- functions for &phase_two and &phase_three