--- loncom/interface/loncreateuser.pm 2017/08/03 16:22:09 1.443 +++ loncom/interface/loncreateuser.pm 2023/11/04 00:06:00 1.472 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.443 2017/08/03 16:22:09 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.472 2023/11/04 00:06:00 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -70,7 +70,9 @@ use Apache::lonlocal; use Apache::longroup; use Apache::lonuserutils; use Apache::loncoursequeueadmin; +use Apache::lonviewcoauthors; use LONCAPA qw(:DEFAULT :match); +use HTML::Entities; my $loginscript; # piece of javascript used in two separate instances my $authformnop; @@ -78,9 +80,10 @@ my $authformkrb; my $authformint; my $authformfsys; my $authformloc; +my $authformlti; sub initialize_authen_forms { - my ($dom,$formname,$curr_authtype,$mode) = @_; + my ($dom,$formname,$curr_authtype,$mode,$readonly) = @_; my ($krbdef,$krbdefdom) = &Apache::loncommon::get_kerberos_defaults($dom); my %param = ( formname => $formname, kerb_def_dom => $krbdefdom, @@ -88,7 +91,7 @@ sub initialize_authen_forms { domain => $dom, ); my %abv_auth = &auth_abbrev(); - if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix):(.*)$/) { + if ($curr_authtype =~ /^(krb4|krb5|internal|localauth|unix|lti):(.*)$/) { my $long_auth = $1; my $curr_autharg = $2; my %abv_auth = &auth_abbrev(); @@ -101,12 +104,16 @@ sub initialize_authen_forms { $param{'mode'} = $mode; } } + if ($readonly) { + $param{'readonly'} = 1; + } $loginscript = &Apache::loncommon::authform_header(%param); $authformkrb = &Apache::loncommon::authform_kerberos(%param); $authformnop = &Apache::loncommon::authform_nochange(%param); $authformint = &Apache::loncommon::authform_internal(%param); $authformfsys = &Apache::loncommon::authform_filesystem(%param); $authformloc = &Apache::loncommon::authform_local(%param); + $authformlti = &Apache::loncommon::authform_lti(%param); } sub auth_abbrev { @@ -116,6 +123,7 @@ sub auth_abbrev { internal => 'int', localauth => 'loc', unix => 'fsys', + lti => 'lti', ); return %abv_auth; } @@ -123,14 +131,82 @@ sub auth_abbrev { # ==================================================== sub user_quotas { - my ($ccuname,$ccdomain) = @_; + my ($ccuname,$ccdomain,$name) = @_; my %lt = &Apache::lonlocal::texthash( - 'usrt' => "User Tools", 'cust' => "Custom quota", 'chqu' => "Change quota", ); - - my $quota_javascript = <<"END_SCRIPT"; + my ($output,$longinsttype); + my ($usertypes,$order) = &Apache::lonnet::retrieve_inst_usertypes($ccdomain); + my %titles = &Apache::lonlocal::texthash ( + portfolio => "Disk space allocated to user's portfolio files", + author => "Disk space allocated to user's Authoring Space", + ); + 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,$colspan); + $custom_on = ' '; + $custom_off = ' checked="checked" '; + $colspan = ' colspan="2"'; + 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,[_2]as determined by the user's institutional". + " affiliation ([_3]).",$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,[_2]is determined by the user's institutional". + " affiliation ([_3]).",$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"; + } + return $output; +} + +sub user_quota_js { + return <<"END_SCRIPT"; END_SCRIPT - 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)) || - (&Apache::lonnet::allowed('udp',$ccdomain))) { - $output .= &build_tools_display($ccuname,$ccdomain,'tools'); - } - 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}; +} + +sub set_custom_js { + return <<"END_SCRIPT"; + + + +END_SCRIPT + } sub build_tools_display { my ($ccuname,$ccdomain,$context) = @_; my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay, - $colspan,$isadv,%domconfig); + $colspan,$isadv,%domconfig,@defaulteditors,@customeditors,@custommanagers, + @possmanagers,$editorsty,$customsty); 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)", + 'webdav' => "WebDAV access to Authoring Spaces (https)", + 'editors' => "Available Editors", + 'managers' => "Co-authors who can add/revoke co-authors", 'portfolio' => "Personal User Portfolio", + 'portaccess' => "Portfolio Shareable", + 'timezone' => "Can set Time Zone", 'avai' => "Available", 'cusa' => "availability", 'chse' => "Change setting", @@ -253,51 +293,74 @@ sub build_tools_display { 'community' => 'Can request creation of communities', 'textbook' => 'Can request creation of textbook courses', 'placement' => 'Can request creation of placement tests', + 'lti' => 'Can request creation of LTI courses', 'requestauthor' => 'Can request author space', + 'edit' => 'Standard editor (Edit)', + 'xml' => 'Text editor (EditXML)', + 'daxe' => 'Daxe editor (Daxe)', ); + $isadv = &Apache::lonnet::is_advanced_user($ccdomain,$ccuname); if ($context eq 'requestcourses') { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, 'requestcourses.official','requestcourses.unofficial', 'requestcourses.community','requestcourses.textbook', - 'requestcourses.placement'); - @usertools = ('official','unofficial','community','textbook','placement'); + 'requestcourses.placement','requestcourses.lti'); + @usertools = ('official','unofficial','community','textbook','placement','lti'); @options =('norequest','approval','autolimit','validate'); %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain); %reqtitles = &courserequest_titles(); %reqdisplay = &courserequest_display(); - $colspan = ' colspan="2"'; %domconfig = &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain); - $isadv = &Apache::lonnet::is_advanced_user($ccdomain,$ccuname); } elsif ($context eq 'requestauthor') { - %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, - '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); + } elsif ($context eq 'authordefaults') { + %domconfig = + &Apache::lonnet::get_dom('configuration',['quotas','authordefaults'],$ccdomain); + %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname,'tools.webdav', + 'authoreditors','authormanagers', + 'domcoord.author'); + @usertools = ('webdav','editors','managers'); + $colspan = ' colspan="2"'; } else { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, 'tools.aboutme','tools.portfolio','tools.blog', - 'tools.webdav'); - @usertools = ('aboutme','blog','webdav','portfolio'); + 'tools.timezone','tools.portaccess'); + @usertools = ('aboutme','blog','portfolio','portaccess','timezone'); + $colspan = ' colspan="2"'; } foreach my $item (@usertools) { my ($custom_access,$curr_access,$cust_on,$cust_off,$tool_on,$tool_off, - $currdisp,$custdisp,$custradio); + $currdisp,$custdisp,$custradio,$onclick); $cust_off = 'checked="checked" '; $tool_on = 'checked="checked" '; - $curr_access = + $curr_access = &Apache::lonnet::usertools_access($ccuname,$ccdomain,$item,undef, - $context); + $context,\%userenv,'', + {'is_adv' => $isadv}); if ($context eq 'requestauthor') { if ($userenv{$context} ne '') { $cust_on = ' checked="checked" '; $cust_off = ''; - } + } + } elsif ($context eq 'authordefaults') { + if ($item eq 'editors') { + if ($userenv{'author'.$item} ne '') { + $cust_on = ' checked="checked" '; + $cust_off = ''; + } + } elsif ($item eq 'webdav') { + if ($userenv{'tools.'.$item} ne '') { + $cust_on = ' checked="checked" '; + $cust_off = ''; + } + } } elsif ($userenv{$context.'.'.$item} ne '') { $cust_on = ' checked="checked" '; $cust_off = ''; @@ -305,46 +368,122 @@ sub build_tools_display { if ($context eq 'requestcourses') { if ($userenv{$context.'.'.$item} eq '') { $custom_access = &mt('Currently from default setting.'); + $customsty = ' style="display:none;"'; } else { $custom_access = &mt('Currently from custom setting.'); + $customsty = ' style="display:block;"'; } } elsif ($context eq 'requestauthor') { if ($userenv{$context} eq '') { $custom_access = &mt('Currently from default setting.'); + $customsty = ' style="display:none;"'; } else { $custom_access = &mt('Currently from custom setting.'); + $customsty = ' style="display:block;"'; + } + } elsif ($item eq 'editors') { + if ($userenv{'author'.$item} eq '') { + if (ref($domconfig{'authordefaults'}{'editors'}) eq 'ARRAY') { + @defaulteditors = @{$domconfig{'authordefaults'}{'editors'}}; + } else { + @defaulteditors = ('edit','xml'); + } + $custom_access = &mt('Can use: [_1]', + join(', ', map { $lt{$_} } @defaulteditors)); + $editorsty = ' style="display:none;"'; + } else { + $custom_access = &mt('Currently from custom setting.'); + foreach my $editor (split(/,/,$userenv{'author'.$item})) { + if ($editor =~ /^(edit|daxe|xml)$/) { + push(@customeditors,$editor); + } + } + if (@customeditors) { + if (@customeditors > 1) { + $custom_access .= '
'; + } else { + $custom_access .= ' '; + } + $custom_access .= &mt('Can use: [_1]', + join(', ', map { $lt{$_} } @customeditors)). + ''; + } else { + $custom_access .= ' '.&mt('No available editors'); + } + $editorsty = ' style="display:block;"'; + } + } elsif ($item eq 'managers') { + my %ca_roles = &Apache::lonnet::get_my_roles($ccuname,$ccdomain,undef, + ['active','future'],['ca']); + if (keys(%ca_roles)) { + foreach my $entry (sort(keys(%ca_roles))) { + if ($entry =~ /^($match_username\:$match_domain):ca$/) { + my $user = $1; + unless ($user eq "$ccuname:$ccdomain") { + push(@possmanagers,$user); + } + } + } + } + if ($userenv{'author'.$item} eq '') { + $custom_access = &mt('Currently author manages co-author roles'); + } else { + if (keys(%ca_roles)) { + foreach my $user (split(/,/,$userenv{'author'.$item})) { + if ($user =~ /^($match_username):($match_domain)$/) { + if (exists($ca_roles{$user.':ca'})) { + unless ($user eq "$ccuname:$ccdomain") { + push(@custommanagers,$user); + } + } + } + } + } + if (@custommanagers) { + $custom_access = &mt('Co-authors who manage co-author roles: [_1]', + join(', ',@custommanagers)); + } else { + $custom_access = &mt('Currently author manages co-author roles'); + } } } else { - if ($userenv{$context.'.'.$item} eq '') { + my $current = $userenv{$context.'.'.$item}; + if ($item eq 'webdav') { + $current = $userenv{'tools.webdav'}; + } + if ($current eq '') { $custom_access = &mt('Availability determined currently from default setting.'); if (!$curr_access) { $tool_off = 'checked="checked" '; $tool_on = ''; } + $customsty = ' style="display:none;"'; } else { $custom_access = &mt('Availability determined currently from custom setting.'); - if ($userenv{$context.'.'.$item} == 0) { + if ($current == 0) { $tool_off = 'checked="checked" '; $tool_on = ''; } + $customsty = ' style="display:inline;"'; } } $output .= ' '."\n". ' '.$lt{$item}.''."\n". ' '."\n". &Apache::loncommon::start_data_table_row()."\n"; - if (($context eq 'requestcourses') || ($context eq 'requestauthor')) { - my ($curroption,$currlimit); + my ($curroption,$currlimit,$customsty); my $envkey = $context.'.'.$item; if ($context eq 'requestauthor') { $envkey = $context; } if ($userenv{$envkey} ne '') { $curroption = $userenv{$envkey}; + $customsty = ' style="display:block"'; } else { + $customsty = ' style="display:none"'; my (@inststatuses); if ($context eq 'requestcourses') { $curroption = @@ -361,6 +500,11 @@ sub build_tools_display { if (!$curroption) { $curroption = 'norequest'; } + my $name = 'crsreq_'.$item; + if ($context eq 'requestauthor') { + $name = $item; + } + $onclick = ' onclick="javascript:toggleCustom(this.form,'."'customtext_$item','custom$item'".');"'; if ($curroption =~ /^autolimit=(\d*)$/) { $currlimit = $1; if ($currlimit eq '') { @@ -371,7 +515,7 @@ sub build_tools_display { } else { $currdisp = $reqdisplay{$curroption}; } - $custdisp = ''; + $custdisp = '
'; foreach my $option (@options) { my $val = $option; if ($option eq 'norequest') { @@ -394,53 +538,114 @@ sub build_tools_display { $checked = ' checked="checked"'; } } - my $name = 'crsreq_'.$item; - if ($context eq 'requestauthor') { - $name = $item; + if ($option eq 'autolimit') { + $custdisp .= '
'; } - $custdisp .= '
'; + $custdisp .= ' '; + } + $custdisp .= ''; + $custradio = '
'.$custdisp; + } elsif ($item eq 'editors') { + $output .= ''.$custom_access.''."\n". + &Apache::loncommon::end_data_table_row()."\n"; + unless (&Apache::lonnet::allowed('udp',$ccdomain)) { + $output .= &Apache::loncommon::start_data_table_row()."\n". + ''. + $lt{'chse'}.': '.(' ' x3). + '
'. + '
'; + foreach my $editor ('edit','xml','daxe') { + my $checked; + if ($userenv{'author'.$item} eq '') { + if (grep(/^\Q$editor\E$/,@defaulteditors)) { + $checked = ' checked="checked"'; + } + } elsif (grep(/^\Q$editor\E$/,@customeditors)) { + $checked = ' checked="checked"'; + } + $output .= ' '; + } + $output .= '
'. + &Apache::loncommon::end_data_table_row()."\n"; + } + } elsif ($item eq 'managers') { + $output .= ''.$custom_access.''."\n". + &Apache::loncommon::end_data_table_row()."\n"; + unless ((&Apache::lonnet::allowed('udp',$ccdomain)) || + (($userenv{'domcoord.author'} eq 'blocked') && + (($env{'user.name'} ne $ccuname) || ($env{'user.domain'} ne $ccdomain)))) { + $output .= + &Apache::loncommon::start_data_table_row()."\n". + ''; + if (@possmanagers) { + $output .= &mt('Select manager(s)').': '; + foreach my $user (@possmanagers) { + my $checked; + if (grep(/^\Q$user\E$/,@custommanagers)) { + $checked = ' checked="checked"'; + } + $output .= ' '; + } + } else { + $output .= &mt('No co-author roles assignable as manager'); + } + $output .= ''. + &Apache::loncommon::end_data_table_row()."\n"; } - $custdisp .= '
'; } else { $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; - } + $onclick = 'onclick="javascript:toggleCustom(this.form,'."'customtext_$item','custom$item'".');" '; $custdisp = '  '; - $custradio = (' 'x2).'--'.$lt{'cusa'}.': '.$custdisp. - ''; - } - $output .= ' '.$custom_access.(' 'x4). - $lt{'avai'}.': '.$currdisp.''."\n". - &Apache::loncommon::end_data_table_row()."\n"; - unless (&Apache::lonnet::allowed('udp',$ccdomain)) { - $output .= + $tool_off.$onclick.'/>'.&mt('Off').''; + $custradio = ''. + '--'.$lt{'cusa'}.': '.$custdisp.''; + } + unless (($item eq 'editors') || ($item eq 'managers')) { + $output .= ' '.$custom_access.(' 'x4). + $lt{'avai'}.': '.$currdisp.''."\n". + &Apache::loncommon::end_data_table_row()."\n"; + unless (&Apache::lonnet::allowed('udp',$ccdomain)) { + $output .= &Apache::loncommon::start_data_table_row()."\n". - ' '. + ''. $lt{'chse'}.': '.(' ' x3). + $cust_off.$onclick.'/>'.$lt{'usde'}.''.(' ' x3). ''.$custradio.''. - &Apache::loncommon::end_data_table_row()."\n"; + $cust_on.$onclick.'/>'.$lt{'uscu'}.''; + if ($colspan) { + $output .= ''; + } + $output .= $custradio.''. + &Apache::loncommon::end_data_table_row()."\n"; + } } } return $output; @@ -528,7 +733,7 @@ sub coursereq_externaluser { sub domainrole_req { my ($ccuname,$ccdomain) = @_; return '

'. - &mt('User Can Request Assignment of Domain Roles?'). + &mt('Can Request Assignment of Domain Roles?'). '

'."\n". &Apache::loncommon::start_data_table(). &build_tools_display($ccuname,$ccdomain, @@ -536,6 +741,18 @@ sub domainrole_req { &Apache::loncommon::end_data_table(); } +sub authoring_defaults { + my ($ccuname,$ccdomain) = @_; + return '

'. + &mt('Authoring Space defaults (if role assigned)'). + '

'."\n". + &Apache::loncommon::start_data_table(). + &build_tools_display($ccuname,$ccdomain, + 'authordefaults'). + &user_quotas($ccuname,$ccdomain,'author'). + &Apache::loncommon::end_data_table(); +} + sub courserequest_titles { my %titles = &Apache::lonlocal::texthash ( official => 'Official', @@ -543,6 +760,7 @@ sub courserequest_titles { community => 'Communities', textbook => 'Textbook', placement => 'Placement Tests', + lti => 'LTI Provider', norequest => 'Not allowed', approval => 'Approval by Dom. Coord.', validate => 'With validation', @@ -886,7 +1104,15 @@ ENDBLOCK (!(($env{'form.action'} eq 'singleuser') && ($context eq 'domain') && (!&Apache::lonnet::allowed('mau',$env{'request.role.domain'}))))) { my $defdom=$env{'request.role.domain'}; - my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain'); + my ($trusted,$untrusted); + if ($context eq 'course') { + ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$defdom); + } elsif ($context eq 'author') { + ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('othcoau',$defdom); + } elsif ($context eq 'domain') { + ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('domroles',$defdom); + } + my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain',undef,undef,undef,$trusted,$untrusted); my %lt=&Apache::lonlocal::texthash( 'enro' => 'Enroll one student', 'enrm' => 'Enroll one member', @@ -1247,8 +1473,9 @@ sub print_user_modification_page { my $groupslist = &Apache::lonuserutils::get_groupslist(); - my $js = &validation_javascript($context,$ccdomain,$pjump_def,$crstype, - $groupslist,$newuser,$formname,\%loaditem); + my $js = &validation_javascript($context,$ccdomain,$pjump_def, + $crstype,$groupslist,$newuser, + $formname,\%loaditem,$permission); my %breadcrumb_text = &singleuser_breadcrumb($crstype,$context,$ccdomain); my $helpitem = 'Course_Change_Privileges'; if ($env{'form.action'} eq 'singlestudent') { @@ -1257,6 +1484,7 @@ sub print_user_modification_page { $helpitem = 'Author_Change_Privileges'; } elsif ($context eq 'domain') { $helpitem = 'Domain_Change_Privileges'; + $js .= &set_custom_js(); } push (@{$brcrum}, {href => "javascript:backPage($form)", @@ -1282,6 +1510,32 @@ sub print_user_modification_page { if ($env{'form.popup'}) { $args->{'no_nav_bar'} = 1; } + if (($context eq 'domain') && ($env{'request.role.domain'} eq $ccdomain)) { + my @toggles; + if (&Apache::lonnet::allowed('cau',$ccdomain)) { + my ($isadv,$isauthor) = + &Apache::lonnet::is_advanced_user($ccdomain,$ccuname); + unless ($isauthor) { + push(@toggles,'requestauthor'); + } + push(@toggles,('webdav','editors')); + } + if (&Apache::lonnet::allowed('mut',$ccdomain)) { + push(@toggles,('aboutme','blog','portfolio','portaccess','timezone')); + } + if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { + push(@toggles,('official','unofficial','community','textbook','placement','lti')); + } + if (@toggles) { + my $onload; + foreach my $item (@toggles) { + $onload .= "toggleCustom(document.cu,'customtext_$item','custom$item');"; + } + $args->{'add_entries'} = { + 'onload' => $onload, + }; + } + } my $start_page = &Apache::loncommon::start_page('User Management',$js,$args); @@ -1318,18 +1572,36 @@ ENDFORMINFO } } my $title = ''; + my $need_quota_js; if ($newuser) { my ($portfolioform,$domroleform); if ((&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) || (&Apache::lonnet::allowed('mut',$env{'request.role.domain'}))) { # Current user has quota or user tools modification privileges - $portfolioform = '
'.&user_quotas($ccuname,$ccdomain); + $portfolioform = '

'. + &mt('User Tools'). + '

'."\n". + &Apache::loncommon::start_data_table(); + if (&Apache::lonnet::allowed('mut',$ccdomain)) { + $portfolioform .= &build_tools_display($ccuname,$ccdomain,'tools'); + } + if (&Apache::lonnet::allowed('mpq',$ccdomain)) { + $portfolioform .= &user_quotas($ccuname,$ccdomain,'portfolio'); + $need_quota_js = 1; + } + $portfolioform .= &Apache::loncommon::end_data_table(); } if ((&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) && ($ccdomain eq $env{'request.role.domain'})) { - $domroleform = '
'.&domainrole_req($ccuname,$ccdomain); + $domroleform = &domainrole_req($ccuname,$ccdomain). + &authoring_defaults($ccuname,$ccdomain); + $need_quota_js = 1; + } + my $readonly; + unless ($permission->{'cusr'}) { + $readonly = 1; } - &initialize_authen_forms($ccdomain,$formname); + &initialize_authen_forms($ccdomain,$formname,'','',$readonly); my %lt=&Apache::lonlocal::texthash( 'lg' => 'Login Data', 'hs' => "Home Server", @@ -1360,7 +1632,7 @@ ENDTITLE $r->print('

'.$title.'

'."\n"); $r->print('
'); $r->print(&personal_data_display($ccuname,$ccdomain,$newuser,$context, - $inst_results{$ccuname.':'.$ccdomain})); + $inst_results{$ccuname.':'.$ccdomain},$readonly)); # Option to disable student/employee ID conflict checking not offerred for new users. my ($home_server_pick,$numlib) = &Apache::loncommon::home_server_form_item($ccdomain,'hserver', @@ -1375,7 +1647,7 @@ $lt{'hs'}: $home_server_pick } if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { $r->print('

'. - &mt('User Can Request Creation of Courses/Communities in this Domain?').'

'. + &mt('Can Request Creation of Courses/Communities in this Domain?').''. &Apache::loncommon::start_data_table(). &build_tools_display($ccuname,$ccdomain, 'requestcourses'). @@ -1471,39 +1743,61 @@ ENDAUTH $inst_results{$ccuname.':'.$ccdomain})); if ((&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) || (&Apache::lonnet::allowed('udp',$env{'request.role.domain'}))) { - $r->print('

'.&mt('User Can Request Creation of Courses/Communities in this Domain?').'

'. - &Apache::loncommon::start_data_table()); - if ($env{'request.role.domain'} eq $ccdomain) { - $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses')); + $r->print('

'.&mt('Can Request Creation of Courses/Communities in this Domain?').'

'."\n"); + if (($env{'request.role.domain'} eq $ccdomain) || + (&Apache::lonnet::will_trust('reqcrs',$ccdomain,$env{'request.role.domain'}))) { + $r->print(&Apache::loncommon::start_data_table()); + if ($env{'request.role.domain'} eq $ccdomain) { + $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses')); + } else { + $r->print(&coursereq_externaluser($ccuname,$ccdomain, + $env{'request.role.domain'})); + } + $r->print(&Apache::loncommon::end_data_table()); } else { - $r->print(&coursereq_externaluser($ccuname,$ccdomain, - $env{'request.role.domain'})); + $r->print(&mt('Domain configuration for this domain prohibits course creation by users from domain: "[_1]"', + &Apache::lonnet::domain($ccdomain,'description'))); } - $r->print(&Apache::loncommon::end_data_table()); } $r->print('
'); - my @order = ('auth','quota','tools','requestauthor'); + my @order = ('auth','quota','tools','requestauthor','authordefaults'); my %user_text; my ($isadv,$isauthor) = &Apache::lonnet::is_advanced_user($ccdomain,$ccuname); - if ((!$isauthor) && - ((&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) || + if (((&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) || (&Apache::lonnet::allowed('udp',$env{'request.role.domain'}))) && - ($env{'request.role.domain'} eq $ccdomain)) { - $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain); + ($env{'request.role.domain'} eq $ccdomain)) { + if (!$isauthor) { + $user_text{'requestauthor'} = &domainrole_req($ccuname,$ccdomain); + } + $user_text{'authordefaults'} = &authoring_defaults($ccuname,$ccdomain); + if (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) { + $need_quota_js = 1; + } } - $user_text{'auth'} = &user_authentication($ccuname,$ccdomain,$formname); + $user_text{'auth'} = &user_authentication($ccuname,$ccdomain,$formname,$crstype,$permission); if ((&Apache::lonnet::allowed('mpq',$ccdomain)) || (&Apache::lonnet::allowed('mut',$ccdomain)) || (&Apache::lonnet::allowed('udp',$ccdomain))) { + $user_text{'quota'} = '

'.&mt('User Tools').'

'."\n". + &Apache::loncommon::start_data_table(); + if ((&Apache::lonnet::allowed('mut',$ccdomain)) || + (&Apache::lonnet::allowed('udp',$ccdomain))) { + $user_text{'quota'} .= &build_tools_display($ccuname,$ccdomain,'tools'); + } # Current user has quota modification privileges - $user_text{'quota'} = &user_quotas($ccuname,$ccdomain); + if ((&Apache::lonnet::allowed('mpq',$ccdomain)) || + (&Apache::lonnet::allowed('udp',$ccdomain))) { + $user_text{'quota'} .= &user_quotas($ccuname,$ccdomain,'portfolio'); + $need_quota_js = 1; + } + $user_text{'quota'} .= &Apache::loncommon::end_data_table(); } if (!&Apache::lonnet::allowed('mpq',$ccdomain)) { if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) { my %lt=&Apache::lonlocal::texthash( - 'dska' => "Disk quotas for user's portfolio and Authoring Space", - 'youd' => "You do not have privileges to modify the portfolio and/or Authoring Space quotas for this user.", + 'dska' => "Disk quotas for user's portfolio", + 'youd' => "You do not have privileges to modify the portfolio quota for this user.", 'ichr' => "If a change is required, contact a domain coordinator for the domain", ); $user_text{'quota'} = < "User Tools Availability", - 'yodo' => "You do not have privileges to modify Portfolio, Blog, WebDAV, or Personal Information Page settings for this user.", + 'yodo' => "You do not have privileges to modify Portfolio, Blog, Personal Information Page, or Time Zone settings for this user.", 'ifch' => "If a change is required, contact a domain coordinator for the domain", ); $user_text{'tools'} = <print(' onclick="auth_check()" \>'."\n"); } else { - $r->print('onclick="this.form.submit()" \>'."\n"); + $r->print(' onclick="this.form.submit()" \>'."\n"); } } else { $r->print(''. @@ -1614,6 +1908,9 @@ ENDNOTOOLSPRIV $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain'])); $r->print(''); $r->print('

'); + if ($need_quota_js) { + $r->print(&user_quota_js()); + } return; } @@ -1672,14 +1969,16 @@ sub date_sections_select { sub validation_javascript { my ($context,$ccdomain,$pjump_def,$crstype,$groupslist,$newuser,$formname, - $loaditem) = @_; + $loaditem,$permission) = @_; my $dc_setcourse_code = ''; my $nondc_setsection_code = ''; if ($context eq 'domain') { - my $dcdom = $env{'request.role.domain'}; - $loaditem->{'onload'} = "document.cu.coursedesc.value='';"; - $dc_setcourse_code = - &Apache::lonuserutils::dc_setcourse_js('cu','singleuser',$context); + if ((ref($permission) eq 'HASH') && ($permission->{'cusr'})) { + my $dcdom = $env{'request.role.domain'}; + $loaditem->{'onload'} = "document.cu.coursedesc.value='';"; + $dc_setcourse_code = + &Apache::lonuserutils::dc_setcourse_js('cu','singleuser',$context); + } } else { my $checkauth; if (($newuser) || (&Apache::lonnet::allowed('mau',$ccdomain))) { @@ -1751,7 +2050,12 @@ sub display_existing_roles { next unless (($rnum eq $env{'course.'.$env{'request.course.id'}.'.num'}) && ($rdom eq $env{'course.'.$env{'request.course.id'}.'.domain'})); } elsif ($context eq 'author') { - next unless (($rnum eq $env{'user.name'}) && ($rdom eq $env{'request.role.domain'})); + if ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$}) { + my ($audom,$auname) = ($1,$2); + next unless (($rnum eq $auname) && ($rdom eq $audom)); + } else { + next unless (($rnum eq $env{'user.name'}) && ($rdom eq $env{'request.role.domain'})); + } } my ($newkey,$newvalue,$newrole); $newkey = '/'.$rdom.'/'.$rnum; @@ -1911,6 +2215,8 @@ sub display_existing_roles { $area=~m{/($match_domain)/($match_username)}; if (&Apache::lonuserutils::authorpriv($2,$1)) { $allowed=1; + } elsif (&Apache::lonuserutils::coauthorpriv($2,$1)) { + $allowed=1; } else { $allowed=0; } @@ -2013,6 +2319,9 @@ sub display_existing_roles { } } elsif ($env{'request.role'} =~ /^au\./) { $contextrole = &mt('Existing Co-Author Roles in your Authoring Space'); + } elsif ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)/$}) { + $contextrole = &mt('Existing Co-Author Roles in [_1] Authoring Space', + ''.$1.'_'.$2.''); } else { if ($showall) { $contextrole = &mt('Existing Roles in this Domain'); @@ -2054,13 +2363,25 @@ sub new_coauthor_roles { # # Co-Author # - if (&Apache::lonuserutils::authorpriv($env{'user.name'}, - $env{'request.role.domain'}) && - ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) { + my ($cuname,$cudom); + if (($env{'request.role'} eq "au./$env{'user.domain'}/") || + ($env{'request.role'} eq "dc./$env{'user.domain'}/")) { + $cuname=$env{'user.name'}; + $cudom=$env{'request.role.domain'}; # No sense in assigning co-author role to yourself - $addrolesdisplay = 1; - my $cuname=$env{'user.name'}; - my $cudom=$env{'request.role.domain'}; + if ((&Apache::lonuserutils::authorpriv($cuname,$cudom)) && + ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) { + $addrolesdisplay = 1; + } + } elsif ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$}) { + ($cudom,$cuname) = ($1,$2); + if ((&Apache::lonuserutils::coauthorpriv($cuname,$cudom)) && + ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain) && + ($cudom ne $ccdomain || $cuname ne $ccuname)) { + $addrolesdisplay = 1; + } + } + if ($addrolesdisplay) { my %lt=&Apache::lonlocal::texthash( 'cs' => "Authoring Space", 'act' => "Activate", @@ -2115,6 +2436,17 @@ sub new_coauthor_roles { ($env{'user.domain'} eq $ccdomain)) { $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Authoring Space is not permitted')); } + } elsif ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$}) { + if (!(&Apache::lonuserutils::coauthorpriv($2,$1))) { + $r->print(''. + &mt('You do not have privileges to assign co-author roles.'). + ''); + } elsif (($env{'user.name'} eq $ccuname) && + ($env{'user.domain'} eq $ccdomain)) { + $r->print(&mt('Assigning yourself a co-author or assistant co-author role in an author area in Authoring Space in which you already have a co-author role is not permitted')); + } elsif (($cudom eq $ccdomain) && ($cuname eq $ccuname)) { + $r->print(&mt("Assigning a co-author or assistant co-author role to an Authoring Space's author is not permitted")); + } } return $addrolesdisplay;; } @@ -2135,11 +2467,20 @@ sub new_domain_roles { ''.&mt('Start').''.&mt('End').''. &Apache::loncommon::end_data_table_header_row(); my @allroles = &Apache::lonuserutils::roles_by_context('domain'); + my $uprimary = &Apache::lonnet::domain($env{'request.role.domain'},'primary'); + my $uintdom = &Apache::lonnet::internet_dom($uprimary); foreach my $thisdomain (sort(&Apache::lonnet::all_domains())) { foreach my $role (@allroles) { next if ($role eq 'ad'); next if (($role eq 'au') && ($ccdomain ne $thisdomain)); if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) { + if ($role eq 'dc') { + unless ($thisdomain eq $env{'request.role.domain'}) { + my $domprim = &Apache::lonnet::domain($thisdomain,'primary'); + my $intdom = &Apache::lonnet::internet_dom($domprim); + next unless ($uintdom eq $intdom); + } + } my $plrole=&Apache::lonnet::plaintext($role); my %lt=&Apache::lonlocal::texthash( 'ssd' => "Set Start Date", @@ -2170,7 +2511,7 @@ sub new_domain_roles { } sub user_authentication { - my ($ccuname,$ccdomain,$formname) = @_; + my ($ccuname,$ccdomain,$formname,$crstype,$permission) = @_; my $currentauth=&Apache::lonnet::queryauthenticate($ccuname,$ccdomain); my $outcome; my %lt=&Apache::lonlocal::texthash( @@ -2181,7 +2522,7 @@ sub user_authentication { 'ld' => "Login Data" ); # Check for a bad authentication type - if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth):/) { + if ($currentauth !~ /^(krb4|krb5|unix|internal|localauth|lti):/) { # bad authentication scheme if (&Apache::lonnet::allowed('mau',$ccdomain)) { &initialize_authen_forms($ccdomain,$formname); @@ -2243,6 +2584,43 @@ ENDBADAUTH } $outcome .= &Apache::loncommon::end_data_table(); } else { + if (($currentauth =~ /^internal:/) && + (&Apache::lonuserutils::can_change_internalpass($ccuname,$ccdomain,$crstype,$permission))) { + $outcome = <<"ENDJS"; + +ENDJS + + $outcome .= '

'.$lt{'ld'}.'

'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_row(). + ''.&mt('Internally authenticated').'
'.&mt("Change user's password?"). + ''.(' 'x2). + ''. + ''. + &Apache::loncommon::end_data_table_row(). + &Apache::loncommon::end_data_table(); + } if (&Apache::lonnet::allowed('udp',$ccdomain)) { # Current user has rights to view domain preferences for user's domain my $result; @@ -2260,6 +2638,8 @@ ENDBADAUTH $result = &mt('Currently using local (institutional) authentication.'); } elsif ($currentauth =~ /^unix:/) { $result = &mt('Currently Filesystem Authenticated.'); + } elsif ($currentauth =~ /^lti:/) { + $result = &mt('Currently LTI authenticated.'); } $outcome = '

'.$lt{'ld'}.'

'. &Apache::loncommon::start_data_table(). @@ -2298,6 +2678,9 @@ sub modify_login_block { if ($can_assign{'loc'}) { push(@authform_others,$authformloc); } + if ($can_assign{'lti'}) { + push(@authform_others,$authformlti); + } if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) { $show_override_msg = 1; } @@ -2309,6 +2692,9 @@ sub modify_login_block { if ($can_assign{'loc'}) { push(@authform_others,$authformloc); } + if ($can_assign{'lti'}) { + push(@authform_others,$authformlti); + } if ($can_assign{'int'}) { $show_override_msg = 1; } @@ -2323,6 +2709,9 @@ sub modify_login_block { if ($can_assign{'loc'}) { push(@authform_others,$authformloc); } + if ($can_assign{'lti'}) { + push(@authform_others,$authformlti); + } if ($can_assign{'fsys'}) { $show_override_msg = 1; } @@ -2334,9 +2723,23 @@ sub modify_login_block { if ($can_assign{'int'}) { push(@authform_others,$authformint); } + if ($can_assign{'lti'}) { + push(@authform_others,$authformlti); + } if ($can_assign{'loc'}) { $show_override_msg = 1; } + } elsif ($currentauth=~/^lti:/) { + $authformcurrent=$authformlti; + if (($can_assign{'krb4'}) || ($can_assign{'krb5'})) { + push(@authform_others,$authformkrb); + } + if ($can_assign{'int'}) { + push(@authform_others,$authformint); + } + if ($can_assign{'loc'}) { + push(@authform_others,$authformloc); + } } if ($show_override_msg) { $authformcurrent = '\n"); - $r->print("\n"); - $r->print("\n'.&Apache::loncommon::end_data_table_row() .&Apache::loncommon::end_data_table(); @@ -6403,7 +7627,7 @@ sub get_noedit_fields { } } return %noedit; -} +} sub visible_in_stdcat { my ($cdom,$cnum,$domconf) = @_; @@ -6511,6 +7735,7 @@ sub visible_in_stdcat { } sub cat_visibility { + my ($cdom) = @_; my %visactions = &Apache::lonlocal::texthash( vis => 'This course/community currently appears in the Course/Community Catalog for this domain.', gen => 'Courses can be both self-cataloging, based on an institutional code (e.g., fs08phy231), or can be assigned categories from a hierarchy defined for the domain.', @@ -6523,13 +7748,24 @@ sub cat_visibility { dc_chgconf => 'Ask a domain coordinator to change the Catalog type for this domain.', dc_setcode => 'Ask a domain coordinator to assign a six character code to the course', dc_unhide => 'Ask a domain coordinator to change the "Exclude from course catalog" setting.', - dc_addinst => 'Ask a domain coordinator to enable display the catalog of "Official courses (with institutional codes)".', + dc_addinst => 'Ask a domain coordinator to enable catalog display of "Official courses (with institutional codes)".', dc_instcode => 'Ask a domain coordinator to assign an institutional code (if this is an official course).', dc_catalog => 'Ask a domain coordinator to enable or create at least one course category in the domain.', dc_categories => 'Ask a domain coordinator to create a hierarchy of categories and sub categories for courses in the domain.', dc_chgcat => 'Ask a domain coordinator to change the category assigned to the course, as the one currently assigned is no longer used in the domain', dc_addcat => 'Ask a domain coordinator to assign a category to the course.', ); + if ($env{'request.role'} eq "dc./$cdom/") { + $visactions{'dc_chgconf'} = &mt('Use: "Main menu" [_1] "Set domain configuration" [_1] "Cataloging of courses/communities" to change the Catalog type for this domain.','»'); + $visactions{'dc_setcode'} = &mt('Use: "Main menu" [_1] "Set domain configuration" [_1] "Cataloging of courses/communities" to assign a six character code to the course.','»'); + $visactions{'dc_unhide'} = &mt('Use: "Main menu" [_1] "Set domain configuration" [_1] "Cataloging of courses/communities" to change the "Exclude from course catalog" setting.','»'); + $visactions{'dc_addinst'} = &mt('Use: "Main menu" [_1] "Set domain configuration" [_1] "Cataloging of courses/communities" to enable catalog display of "Official courses (with institutional codes)".','»'); + $visactions{'dc_instcode'} = &mt('Use: "Main menu" [_1] "View or modify a course or community" [_1] "View/Modify course owner, institutional code ... " to assign an institutional code (if this is an official course).','»'); + $visactions{'dc_catalog'} = &mt('Use: "Main menu" [_1] "Set domain configuration" [_1] "Cataloging of courses/communities" to enable or create at least one course category in the domain.','»'); + $visactions{'dc_categories'} = &mt('Use: "Main menu" [_1] "Set domain configuration" [_1] "Cataloging of courses/communities" to create a hierarchy of categories and sub categories for courses in the domain.','»'); + $visactions{'dc_chgcat'} = &mt('Use: "Main menu" [_1] "View or modify a course or community" [_1] "View/Modify catalog settings for course" to change the category assigned to the course, as the one currently assigned is no longer used in the domain.','»'); + $visactions{'dc_addcat'} = &mt('Use: "Main menu" [_1] "View or modify a course or community" [_1] "View/Modify catalog settings for course" to assign a category to the course.','»'); + } $visactions{'unhide'} = &mt('Use [_1]Categorize course[_2] to change the "Exclude from course catalog" setting.','','"'); $visactions{'chgcat'} = &mt('Use [_1]Categorize course[_2] to change the category assigned to the course, as the one currently assigned is no longer used in the domain.','"','"'); $visactions{'addcat'} = &mt('Use [_1]Categorize course[_2] to assign a category to the course.','"','"'); @@ -6655,9 +7891,11 @@ sub print_userchangelogs_display { &Apache::loncommon::restore_course_settings('roles_log', \%saveable_parameters); } elsif ($context eq 'author') { - $domain = $env{'user.domain'}; + $domain = $env{'user.domain'}; if ($env{'request.role'} =~ m{^au\./\Q$domain\E/$}) { $username = $env{'user.name'}; + } elsif ($env{'request.role'} =~ m{^ca\./($match_domain)/($match_username)$}) { + ($domain,$username) = ($1,$2); } else { undef($domain); } @@ -6708,12 +7946,13 @@ ENDSCRIPT chgcontext => 'any', rolelog_start_date => $defstart, rolelog_end_date => $now, + approvals => 'any', ); my $more_records = 0; # set current my %curr; - foreach my $item ('show','page','role','chgcontext') { + foreach my $item ('show','page','role','chgcontext','approvals') { $curr{$item} = $env{'form.'.$item}; } my ($startdate,$enddate) = @@ -6787,6 +8026,11 @@ ENDSCRIPT if (($context eq 'course') && ($viewablesec ne '')) { next if ($roleslog{$id}{'logentry'}{'section'} ne $viewablesec); } + if ($curr{'approvals'} eq 'none') { + next if ($roleslog{$id}{'logentry'}{'approval'}); + } elsif ($curr{'approvals'} ne 'any') { + next if ($roleslog{$id}{'logentry'}{'approval'} ne $curr{'approvals'}); + } $count ++; next if ($count < $minshown); unless ($showntableheader) { @@ -6833,11 +8077,30 @@ ENDSCRIPT if ($chgcontext ne '' && $lt{$chgcontext} ne '') { $chgcontext = $lt{$chgcontext}; } + my ($showreqby,%reqby); + if (($roleslog{$id}{'logentry'}{'approval'}) && + ($roleslog{$id}{'logentry'}{'requester'})) { + if ($reqby{$roleslog{$id}{'logentry'}{'requester'}} eq '') { + my ($requname,$requdom) = split(/:/,$roleslog{$id}{'logentry'}{'requester'}); + $reqby{$roleslog{$id}{'logentry'}{'requester'}} = + &Apache::loncommon::plainname($requname,$requdom); + } + $showreqby = &mt('Requester').': '.$reqby{$roleslog{$id}{'logentry'}{'requester'}}.'
'; + if ($roleslog{$id}{'logentry'}{'approval'} eq 'domain') { + $showreqby .= &mt('Adjudicator').': '. + $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}. + ''; + } else { + $showreqby .= ''.&mt('User approved').''; + } + } else { + $showreqby = $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}; + } $r->print( &Apache::loncommon::start_data_table_row() .'' .'' - .'' + .'' .'' .''); if ($context eq 'course') { @@ -7020,9 +8283,10 @@ ENDSCRIPT my ($nav_script,$nav_links); # table header - my $tableheader = '

'. + my $heading = '

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

' + &Apache::loncommon::aboutmewrapper(&Apache::loncommon::plainname($uname,$udom),$uname,$udom)).''; + my $tableheader = $heading .&Apache::loncommon::start_data_table_header_row() .'' .'' @@ -7140,7 +8404,7 @@ ENDSCRIPT $r->print(&Apache::loncommon::end_data_table(). &userlogdisplay_navlinks(\%curr,$more_records)); } else { # No content displayed above - $r->print('

' + $r->print($heading.'

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

'); } @@ -7190,7 +8454,7 @@ sub activity_display_filter { my $nolink = 1; my $output = '
'.$authformcurrent. @@ -2351,9 +2754,9 @@ sub modify_login_block { } sub personal_data_display { - my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$rolesarray, - $now,$captchaform,$emailusername,$usertype,$usernameset,$condition,$excluded) = @_; - my ($output,%userenv,%canmodify,%canmodify_status); + my ($ccuname,$ccdomain,$newuser,$context,$inst_results,$readonly,$rolesarray,$now, + $captchaform,$emailusername,$usertype,$usernameset,$condition,$excluded,$showsubmit) = @_; + my ($output,%userenv,%canmodify,%canmodify_status,$disabled); my @userinfo = ('firstname','middlename','lastname','generation', 'permanentemail','id'); my $rowcount = 0; @@ -2422,6 +2825,8 @@ sub personal_data_display { %canmodify = &selfcreate_canmodify($context,$ccdomain,\@userinfo, $inst_results,$rolesarray); } + } elsif ($readonly) { + $disabled = ' disabled="disabled"'; } my $genhelp=&Apache::loncommon::help_open_topic('Generation'); @@ -2462,8 +2867,8 @@ sub personal_data_display { } $rowcount ++; $output .= &Apache::lonhtmlcommon::row_closure(1); - my $upassone = ''; - my $upasstwo = ''; + my $upassone = ''; + my $upasstwo = ''; $output .= &Apache::lonhtmlcommon::row_title(&mt('Password').'*', 'LC_pick_box_title', 'LC_oddrow_value')."\n". @@ -2477,10 +2882,11 @@ sub personal_data_display { if ($usernameset eq 'free') { my $onclick = "toggleUsernameDisp(this,'selfcreateusername');"; $output .= &Apache::lonhtmlcommon::row_title($lt{'username'},undef,'LC_oddrow_value')."\n". - &mt('Use e-mail address: '). - ''."\n". - (' 'x2). - ''."\n". + ''.&mt('Use e-mail address: '). + ''.(' 'x2). + ''."\n". '$lt{$item}".$oldsetting->{$item}); + $r->print("$lt{$item}\n"); + unless ($item eq 'managers') { + $r->print($oldsetting->{$item}); + } if ($oldsettingtext->{$item}) { if ($oldsetting->{$item}) { - $r->print(' -- '); + unless ($item eq 'managers') { + $r->print(' -- '); + } } $r->print($oldsettingtext->{$item}); } - $r->print("".$newsetting->{$item}); + $r->print(""); + unless ($item eq 'managers') { + $r->print($newsetting->{$item}); + } if ($newsettingtext->{$item}) { if ($newsetting->{$item}) { - $r->print(' -- '); + unless ($item eq 'managers') { + $r->print(' -- '); + } } $r->print($newsettingtext->{$item}); } @@ -3702,6 +4248,11 @@ sub tool_changes { } return; } + my %tooldesc = &Apache::lonlocal::texthash( + 'edit' => 'Standard editor (Edit)', + 'xml' => 'Text editor (EditXML)', + 'daxe' => 'Daxe editor (Daxe)', + ); foreach my $tool (@{$usertools}) { my ($newval,$limit,$envkey); $envkey = $context.'.'.$tool; @@ -3715,6 +4266,51 @@ sub tool_changes { } elsif ($context eq 'requestauthor') { $newval = $env{'form.'.$context}; $envkey = $context; + } elsif ($context eq 'authordefaults') { + if ($tool eq 'editors') { + $envkey = 'authoreditors'; + if ($env{'form.customeditors'} == 1) { + my @editors; + my @posseditors = &Apache::loncommon::get_env_multiple('form.custom_editor'); + if (@posseditors) { + foreach my $editor (@posseditors) { + if (grep(/^\Q$editor\E$/,@posseditors)) { + unless (grep(/^\Q$editor\E$/,@editors)) { + push(@editors,$editor); + } + } + } + } + if (@editors) { + $newval = join(',',(sort(@editors))); + } + } + } elsif ($tool eq 'managers') { + $envkey = 'authormanagers'; + my @possibles = &Apache::loncommon::get_env_multiple('form.custommanagers'); + if (@possibles) { + my %ca_roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'}, + undef,['active','future'],['ca']); + if (keys(%ca_roles)) { + my @custommanagers; + foreach my $user (@possibles) { + if ($user =~ /^($match_username):($match_domain)$/) { + if (exists($ca_roles{$user.':ca'})) { + unless ($user eq $env{'form.ccuname'}.':'.$env{'form.ccdomain'}) { + push(@custommanagers,$user); + } + } + } + } + if (@custommanagers) { + $newval = join(',',sort(@custommanagers)); + } + } + } + } elsif ($tool eq 'webdav') { + $envkey = 'tools.webdav'; + $newval = $env{'form.'.$context.'_'.$tool}; + } } else { $newval = $env{'form.'.$context.'_'.$tool}; } @@ -3733,6 +4329,25 @@ sub tool_changes { } else { $oldaccesstext->{$tool} = &mt("availability set to 'off'"); } + } elsif ($context eq 'authordefaults') { + if ($tool eq 'managers') { + if ($userenv->{$envkey} eq '') { + $oldaccesstext->{$tool} = &mt('Only author may manage co-author roles'); + } else { + my $managers = $userenv->{$envkey}; + $managers =~ s/,/, /g; + $oldaccesstext->{$tool} = $managers; + } + } elsif ($tool eq 'editors') { + $oldaccesstext->{$tool} = &mt('can use: [_1]', + join(', ', map { $tooldesc{$_} } split(/,/,$userenv->{$envkey}))); + } elsif ($tool eq 'webdav') { + if ($userenv->{$envkey}) { + $oldaccesstext->{$tool} = &mt("availability set to 'on'"); + } else { + $oldaccesstext->{$tool} = &mt("availability set to 'off'"); + } + } } else { if ($userenv->{$envkey}) { $oldaccesstext->{$tool} = &mt("availability set to 'on'"); @@ -3741,7 +4356,8 @@ sub tool_changes { } } $changeHash->{$envkey} = $userenv->{$envkey}; - if ($env{'form.custom'.$tool} == 1) { + if (($env{'form.custom'.$tool} == 1) || + (($context eq 'authordefaults') && ($tool eq 'managers') && ($newval ne ''))) { if ($newval ne $userenv->{$envkey}) { $changed->{$tool} = &tool_admin($tool,$newval,$changeHash, $context); @@ -3759,6 +4375,25 @@ sub tool_changes { } else { $newaccesstext->{$tool} = &mt("availability set to 'off'"); } + } elsif ($context eq 'authordefaults') { + if ($tool eq 'editors') { + $newaccesstext->{$tool} = &mt('can use: [_1]', + join(', ', map { $tooldesc{$_} } split(/,/,$changeHash->{$envkey}))); + } elsif ($tool eq 'managers') { + if ($changeHash->{$envkey} eq '') { + $newaccesstext->{$tool} = &mt('Only author may manage co-author roles'); + } else { + my $managers = $changeHash->{$envkey}; + $managers =~ s/,/, /g; + $newaccesstext->{$tool} = $managers; + } + } elsif ($tool eq 'webdav') { + if ($newval) { + $newaccesstext->{$tool} = &mt("availability set to 'on'"); + } else { + $newaccesstext->{$tool} = &mt("availability set to 'off'"); + } + } } else { if ($newval) { $newaccesstext->{$tool} = &mt("availability set to 'on'"); @@ -3769,17 +4404,36 @@ sub tool_changes { } else { $newaccess->{$tool} = $oldaccess->{$tool}; if (($context eq 'requestcourses') || ($context eq 'requestauthor')) { - if ($newval =~ /^autolimit/) { + if ($userenv->{$envkey} =~ /^autolimit/) { if ($limit) { $newaccesstext->{$tool} = &mt('available with automatic approval, up to limit of [quant,_1,request] per user',$limit); } else { $newaccesstext->{$tool} = &mt('available with automatic approval (unlimited)'); } - } elsif ($newval) { - $newaccesstext->{$tool} = $reqdisplay{$newval}; + } elsif ($userenv->{$envkey}) { + $newaccesstext->{$tool} = $reqdisplay{$userenv->{$envkey}}; } else { $newaccesstext->{$tool} = &mt("availability set to 'off'"); } + } elsif ($context eq 'authordefaults') { + if ($tool eq 'editors') { + $newaccesstext->{$tool} = &mt('can use: [_1]', + join(', ', map { $tooldesc{$_} } split(/,/,$userenv->{$envkey}))); + } elsif ($tool eq 'managers') { + if ($userenv->{$envkey} eq '') { + $newaccesstext->{$tool} = &mt('Only author may manage co-author roles'); + } else { + my $managers = $userenv->{$envkey}; + $managers =~ s/,/, /g; + $newaccesstext->{$tool} = $managers; + } + } elsif ($tool eq 'webdav') { + if ($userenv->{$envkey}) { + $newaccesstext->{$tool} = &mt("availability set to 'on'"); + } else { + $newaccesstext->{$tool} = &mt("availability set to 'off'"); + } + } } else { if ($userenv->{$context.'.'.$tool}) { $newaccesstext->{$tool} = &mt("availability set to 'on'"); @@ -3810,6 +4464,25 @@ sub tool_changes { } else { $newaccesstext->{$tool} = &mt("availability set to 'off'"); } + } elsif ($context eq 'authordefaults') { + if ($tool eq 'editors') { + $newaccesstext->{$tool} = &mt('can use: [_1]', + join(', ', map { $tooldesc{$_} } split(/,/,$newval))); + } elsif ($tool eq 'managers') { + if ($newval eq '') { + $newaccesstext->{$tool} = &mt('Only author may manage co-author roles'); + } else { + my $managers = $newval; + $managers =~ s/,/, /g; + $newaccesstext->{$tool} = $managers; + } + } elsif ($tool eq 'webdav') { + if ($userenv->{$envkey}) { + $newaccesstext->{$tool} = &mt("availability set to 'on'"); + } else { + $newaccesstext->{$tool} = &mt("availability set to 'off'"); + } + } } else { if ($userenv->{$context.'.'.$tool}) { $newaccesstext->{$tool} = &mt("availability set to 'on'"); @@ -3821,7 +4494,8 @@ sub tool_changes { } } else { $oldaccess->{$tool} = &mt('default'); - if ($env{'form.custom'.$tool} == 1) { + if (($env{'form.custom'.$tool} == 1) || + (($context eq 'authordefaults') && ($tool eq 'managers') && ($newval ne ''))) { $changed->{$tool} = &tool_admin($tool,$newval,$changeHash, $context); if ($changed->{$tool}) { @@ -3838,6 +4512,25 @@ sub tool_changes { } else { $newaccesstext->{$tool} = &mt("availability set to 'off'"); } + } elsif ($context eq 'authordefaults') { + if ($tool eq 'managers') { + if ($newval eq '') { + $newaccesstext->{$tool} = &mt('Only author may manage co-author roles'); + } else { + my $managers = $newval; + $managers =~ s/,/, /g; + $newaccesstext->{$tool} = $managers; + } + } elsif ($tool eq 'editors') { + $newaccesstext->{$tool} = &mt('can use: [_1]', + join(', ', map { $tooldesc{$_} } split(/,/,$newval))); + } elsif ($tool eq 'webdav') { + if ($newval) { + $newaccesstext->{$tool} = &mt("availability set to 'on'"); + } else { + $newaccesstext->{$tool} = &mt("availability set to 'off'"); + } + } } else { if ($newval) { $newaccesstext->{$tool} = &mt("availability set to 'on'"); @@ -3860,7 +4553,13 @@ sub update_roles { my ($r,$context,$showcredits) = @_; my $now=time; my @rolechanges; - my %disallowed; + my (%disallowed,%got_role_approvals,%got_instdoms,%process_by,%instdoms, + %pending,%reject,%notifydc,%status,%unauthorized,%currqueued); + $got_role_approvals{$context} = ''; + $process_by{$context} = {}; + my @domroles = &Apache::lonuserutils::domain_roles(); + my @cstrroles = &Apache::lonuserutils::construction_space_roles(); + my @courseroles = &Apache::lonuserutils::roles_by_context('course',1); $r->print('

'.&mt('Modifying Roles').'

'); foreach my $key (keys(%env)) { next if (! $env{$key}); @@ -3962,6 +4661,7 @@ sub update_roles { if ($key=~/^form\.ren\:([^\_]+)\_([^\_\.]+)$/) { my $url = $1; my $role = $2; + my $id = $url.'_'.$role; my $logmsg; my $output; if ($role eq 'st') { @@ -3969,10 +4669,17 @@ sub update_roles { my ($cdom,$cnum,$csec) = ($1,$2,$3); my $credits; if ($showcredits) { - my $defaultcredits = + my $defaultcredits = &Apache::lonuserutils::get_defaultcredits($cdom,$cnum); $credits = &get_user_credits($defaultcredits,$cdom,$cnum); } + unless ($udom eq $cdom) { + next if (&Apache::lonuserutils::restricted_dom($context,$id,$udom, + $uname,$role,$now,0,$cdom,$cnum,$csec,$credits, + \%process_by,\%instdoms,\%got_role_approvals, + \%got_instdoms,\%reject,\%pending,\%notifydc, + \%status,\%unauthorized,\%currqueued)); + } my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$cdom,$cnum,$csec,$context,$credits); if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course') || ($result eq 'refused')) { if ($result eq 'refused' && $logmsg) { @@ -3988,12 +4695,28 @@ sub update_roles { } } } else { + my ($cdom,$cnum,$csec); + if (grep(/^\Q$role\E$/,@cstrroles)) { + ($cdom,$cnum) = ($url =~ m{^/($match_domain)/($match_username)$}); + } elsif (grep(/^\Q$role\E$/,@domroles)) { + ($cdom) = ($url =~ m{^/($match_domain)/$}); + } elsif ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) { + ($cdom,$cnum,$csec) = ($1,$2,$3); + } + if ($cdom ne '') { + unless ($udom eq $cdom) { + next if (&Apache::lonuserutils::restricted_dom($context,$id,$udom, + $uname,$role,$now,0,$cdom,$cnum,$csec,'',\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued)); + } + } my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'}, $env{'form.ccuname'},$url,$role,0,$now,'','', $context); - $output = &Apache::lonhtmlcommon::confirm_success(&mt('Re-enabling [_1] in [_2]', - &Apache::lonnet::plaintext($role), - &Apache::loncommon::show_role_extent($url,$context,$role)),$result ne "ok").'
'; + $output = &Apache::lonhtmlcommon::confirm_success(&mt('Re-enabling [_1] in [_2]', + &Apache::lonnet::plaintext($role), + &Apache::loncommon::show_role_extent($url,$context,$role)),$result ne "ok").'
'; if ($result ne "ok") { $output .= &mt('Error: [_1]',$result).'
'; } @@ -4006,6 +4729,17 @@ sub update_roles { # Re-enable custom role if ($key=~m{^form\.ren\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) { my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4); + my $id = $url.'_cr'."/$rdom/$rnam/$rolename"; + my $role = "cr/$rdom/$rnam/$rolename"; + if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) { + my ($cdom,$cnum,$csec) = ($1,$2,$3); + unless ($udom eq $cdom) { + next if (&Apache::lonuserutils::restricted_dom($context,$id,$udom, + $uname,$role,$now,0,$cdom,$cnum,$csec,'',\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued)); + } + } my $result = &Apache::lonnet::assigncustomrole( $env{'form.ccdomain'}, $env{'form.ccuname'}, $url,$rdom,$rnam,$rolename,0,$now,undef,$context); @@ -4027,6 +4761,8 @@ sub update_roles { # Activate a custom role my ($one,$two,$three,$four,$five)=($1,$2,$3,$4,$5); my $url='/'.$one.'/'.$two; + my $id = $url.'_cr/'."$three/$four/$five"; + my $role = "cr/$three/$four/$five"; my $full=$one.'_'.$two.'_cr_cr_'.$three.'_'.$four.'_'.$five; my $start = ( $env{'form.start_'.$full} ? @@ -4035,15 +4771,22 @@ sub update_roles { my $end = ( $env{'form.end_'.$full} ? $env{'form.end_'.$full} : 0 ); - + # split multiple sections my %sections = (); - my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$5); + my $num_sections = &build_roles($env{'form.sec_'.$full},\%sections,$five); if ($num_sections == 0) { + unless ($udom eq $one) { + next if (&Apache::lonuserutils::restricted_dom($context,$id,$udom, + $uname,$role,$start,$end,$one,$two,'','',\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued)); + } $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$url,$three,$four,$five,$start,$end,$context)); } else { my %curr_groups = &Apache::longroup::coursegroups($one,$two); + my ($restricted,$numchanges); foreach my $sec (sort {$a cmp $b} keys(%sections)) { if (($sec eq 'none') || ($sec eq 'all') || exists($curr_groups{$sec})) { @@ -4051,8 +4794,18 @@ sub update_roles { next; } my $securl = $url.'/'.$sec; + my $secid = $securl.'_cr'."/$three/$four/$five"; + undef($restricted); + unless ($udom eq $one) { + next if (&Apache::lonuserutils::restricted_dom($context,$secid,$udom, + $uname,$role,$start,$end,$one,$two,$sec,'',\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued)); + } + $numchanges ++; $r->print(&Apache::loncommon::commit_customrole($udom,$uname,$securl,$three,$four,$five,$start,$end,$context)); } + next unless ($numchanges); } if (!grep(/^cr$/,@rolechanges)) { push(@rolechanges,'cr'); @@ -4061,20 +4814,20 @@ sub update_roles { # Activate roles for sections with 3 id numbers # set start, end times, and the url for the class my ($one,$two,$three)=($1,$2,$3); - my $start = ( $env{'form.start_'.$one.'_'.$two.'_'.$three} ? - $env{'form.start_'.$one.'_'.$two.'_'.$three} : + my $start = ( $env{'form.start_'.$one.'_'.$two.'_'.$three} ? + $env{'form.start_'.$one.'_'.$two.'_'.$three} : $now ); - my $end = ( $env{'form.end_'.$one.'_'.$two.'_'.$three} ? + my $end = ( $env{'form.end_'.$one.'_'.$two.'_'.$three} ? $env{'form.end_'.$one.'_'.$two.'_'.$three} : 0 ); my $url='/'.$one.'/'.$two; - my $type = 'three'; + my $id = $url.'_'.$three; # split multiple sections my %sections = (); my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three); - my $credits; + my ($credits,$numchanges); if ($three eq 'st') { - if ($showcredits) { + if ($showcredits) { my $defaultcredits = &Apache::lonuserutils::get_defaultcredits($one,$two); $credits = $env{'form.credits_'.$one.'_'.$two.'_'.$three}; @@ -4085,11 +4838,19 @@ sub update_roles { } } if ($num_sections == 0) { + unless ($udom eq $one) { + next if (&Apache::lonuserutils::restricted_dom($context,$id,$udom, + $uname,$three,$start,$end,$one,$two,'',$credits,\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued)); + } + $numchanges ++; $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context,$credits)); } else { my %curr_groups = &Apache::longroup::coursegroups($one,$two); my $emptysec = 0; + my $restricted; foreach my $sec (sort {$a cmp $b} keys(%sections)) { $sec =~ s/\W//g; if ($sec ne '') { @@ -4099,14 +4860,34 @@ sub update_roles { next; } my $securl = $url.'/'.$sec; + my $secid = $securl.'_'.$three; + unless ($udom eq $one) { + undef($restricted); + $restricted = &Apache::lonuserutils::restricted_dom($context,$secid,$udom, + $uname,$three,$start,$end,$one,$two,$sec,$credits,\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued); + next if ($restricted); + } + $numchanges ++; $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec,$context,$credits)); } else { $emptysec = 1; } } if ($emptysec) { + unless ($udom eq $one) { + undef($restricted); + $restricted = &Apache::lonuserutils::restricted_dom($context,$id,$udom, + $uname,$three,$start,$end,$one,$two,'',$credits,\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued); + next if ($restricted); + } + $numchanges ++; $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context,$credits)); } + next unless ($numchanges); } if (!grep(/^\Q$three\E$/,@rolechanges)) { push(@rolechanges,$three); @@ -4114,33 +4895,64 @@ sub update_roles { } elsif ($key=~/^form\.act\_([^\_]+)\_([^\_]+)$/) { # Activate roles for sections with two id numbers # set start, end times, and the url for the class - my $start = ( $env{'form.start_'.$1.'_'.$2} ? - $env{'form.start_'.$1.'_'.$2} : + my $start = ( $env{'form.start_'.$1.'_'.$2} ? + $env{'form.start_'.$1.'_'.$2} : $now ); - my $end = ( $env{'form.end_'.$1.'_'.$2} ? + my $end = ( $env{'form.end_'.$1.'_'.$2} ? $env{'form.end_'.$1.'_'.$2} : 0 ); my $one = $1; my $two = $2; my $url='/'.$one.'/'; + my $id = $url.'_'.$two; + my ($cdom,$cnum) = split(/\//,$one); # split multiple sections my %sections = (); + my ($restricted,$numchanges); my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two},\%sections,$two); if ($num_sections == 0) { + unless ($udom eq $one) { + $restricted = &Apache::lonuserutils::restricted_dom($context,$id,$udom, + $uname,$two,$start,$end,$cdom,$cnum,'','',\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued); + next if ($restricted); + } + $numchanges ++; $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context)); } else { my $emptysec = 0; foreach my $sec (sort {$a cmp $b} keys(%sections)) { if ($sec ne '') { my $securl = $url.'/'.$sec; + my $secid = $securl.'_'.$two; + unless ($udom eq $one) { + undef($restricted); + $restricted = &Apache::lonuserutils::restricted_dom($context,$secid,$udom, + $uname,$two,$start,$end,$cdom,$cnum,$sec,'',\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued); + next if ($restricted); + } + $numchanges ++; $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$two,$start,$end,$one,undef,$sec,$context)); } else { $emptysec = 1; } } if ($emptysec) { + unless ($udom eq $one) { + undef($restricted); + $restricted = &Apache::lonuserutils::restricted_dom($context,$id,$udom, + $uname,$two,$start,$end,$cdom,$cnum,'','',\%process_by, + \%instdoms,\%got_role_approvals,\%got_instdoms,\%reject, + \%pending,\%notifydc,\%status,\%unauthorized,\%currqueued); + next if ($restricted); + } + $numchanges ++; $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$two,$start,$end,$one,undef,'',$context)); } + next unless ($numchanges); } if (!grep(/^\Q$two\E$/,@rolechanges)) { push(@rolechanges,$two); @@ -4164,6 +4976,12 @@ sub update_roles { } } } # End of foreach (keys(%env)) + if ((keys(%reject)) || (keys(%unauthorized))) { + $r->print(&Apache::lonuserutils::print_roles_rejected($context,\%reject,\%unauthorized)); + } + if ((keys(%pending)) || (keys(%currqueued))) { + $r->print(&Apache::lonuserutils::print_roles_queued($context,\%pending,\%notifydc,\%currqueued)); + } # Flush the course logs so reverse user roles immediately updated $r->register_cleanup(\&Apache::lonnet::flushcourselogs); if (@rolechanges == 0) { @@ -4218,11 +5036,35 @@ sub enroll_single_student { } } } + my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form(); + my (%got_role_approvals,%got_instdoms,%process_by,%instdoms,%pending,%reject,%notifydc, + %status,%unauthorized,%currqueued); + unless ($env{'form.ccdomain'} eq $env{'course.'.$env{'request.course.id'}.'.domain'}) { + my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $csec = $env{'form.sections'}; + my $id = "/$cdom/$cnum"; + if ($csec ne '') { + $id .= "/$csec"; + } + $id .= '_st'; + if (&Apache::lonuserutils::restricted_dom($context,$id,$env{'form.ccdomain'},$env{'form.ccuname'}, + 'st',$startdate,$enddate,$cdom,$cnum,$csec,$credits, + \%process_by,\%instdoms,\%got_role_approvals,\%got_instdoms, + \%reject,\%pending,\%notifydc,\%status,\%unauthorized,\%currqueued)) { + if ((keys(%reject)) || (keys(%unauthorized))) { + $r->print(&Apache::lonuserutils::print_roles_rejected($context,\%reject,\%unauthorized)); + } + if ((keys(%pending)) || (keys(%currqueued))) { + $r->print(&Apache::lonuserutils::print_roles_queued($context,\%pending,\%notifydc,\%currqueued)); + } + return; + } + } # Clean out any old student roles the user has in this class. &Apache::lonuserutils::modifystudent($env{'form.ccdomain'}, $env{'form.ccuname'},$env{'request.course.id'},undef,$uhome); - my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form(); my $enroll_result = &Apache::lonnet::modify_student_enrollment($env{'form.ccdomain'}, $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'}, @@ -4332,6 +5174,10 @@ sub tool_admin { if (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) { $canchange = 1; } + } elsif ($context eq 'authordefaults') { + if (&Apache::lonnet::allowed('cau',$env{'request.role.domain'})) { + $canchange = 1; + } } elsif (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) { # Current user has quota modification privileges $canchange = 1; @@ -4342,6 +5188,10 @@ sub tool_admin { $toolchanged = 1; if ($tool eq 'requestauthor') { $changeHash->{$context} = $settool; + } elsif (($tool eq 'managers') || ($tool eq 'editors')) { + $changeHash->{'author'.$tool} = $settool; + } elsif ($tool eq 'webdav') { + $changeHash->{'tools.'.$tool} = $settool; } else { $changeHash->{$context.'.'.$tool} = $settool; } @@ -4584,6 +5434,189 @@ sub set_custom_role { ); } +sub show_role_requests { + my ($caller,$dom) = @_; + my $showrolereqs; + my %domconfig = &Apache::lonnet::get_dom('configuration',['privacy'],$dom); + if (ref($domconfig{'privacy'}) eq 'HASH') { + if (ref($domconfig{'privacy'}{'approval'}) eq 'HASH') { + my %approvalconf = %{$domconfig{'privacy'}{'approval'}}; + foreach my $key ('instdom','extdom') { + if (ref($approvalconf{$key}) eq 'HASH') { + if (keys(%{$approvalconf{$key}})) { + foreach my $context ('domain','author','course','community') { + if ($approvalconf{$key}{$context} eq $caller) { + $showrolereqs = 1; + last if ($showrolereqs); + } + } + } + } + last if ($showrolereqs); + } + } + } + return $showrolereqs; +} + +sub display_coauthor_managers { + my ($permission) = @_; + my $output; + if ((ref($permission) eq 'HASH') && ($permission->{'author'})) { + $output = '
'. + ''."\n". + '

'; + my (@possmanagers,@custommanagers); + my %userenv = + &Apache::lonnet::userenvironment($env{'user.domain'}, + $env{'user.name'}, + 'authormanagers'); + my %ca_roles = &Apache::lonnet::get_my_roles(undef,undef,undef, + ['active','future'],['ca']); + if (keys(%ca_roles)) { + foreach my $entry (sort(keys(%ca_roles))) { + if ($entry =~ /^($match_username\:$match_domain):ca$/) { + my $user = $1; + unless ($user eq $env{'user.name'}.':'.$env{'user.domain'}) { + push(@possmanagers,$user); + } + } + } + } + if ($userenv{'authormanagers'} eq '') { + $output .= &mt('Currently author manages co-author roles'); + } else { + if (keys(%ca_roles)) { + foreach my $user (split(/,/,$userenv{'authormanagers'})) { + if ($user =~ /^($match_username)\:($match_domain)$/) { + if (exists($ca_roles{$user.':ca'})) { + unless ($user eq $env{'user.name'}.':'.$env{'user.domain'}) { + push(@custommanagers,$user); + } + } + } + } + } + if (@custommanagers) { + $output .= &mt('Co-authors with active or future roles who currently manage co-author roles: [_1]', + '
'.join(', ',map { &Apache::loncommon::plainname(split(':',$_))." ($_)"; } @custommanagers)); + } else { + $output .= &mt('Currently author manages co-author roles'); + } + } + $output .= "

\n"; + if (@possmanagers) { + $output .= '

'.&mt('If checked, can manage').': '; + foreach my $user (@possmanagers) { + my $checked; + if (grep(/^\Q$user\E$/,@custommanagers)) { + $checked = ' checked="checked"'; + } + $output .= ' '."\n"; + } + $output .= '

'."\n". + '

'."\n"; + } else { + $output .= '

'.&mt('No co-author roles assignable as manager').'

'; + } + $output .= '
'; + } else { + $output = ''. + &mt('You do not have permission to perform this action'). + ''; + } + return $output; +} + +sub update_coauthor_managers { + my ($permission) = @_; + my $output; + if ((ref($permission) eq 'HASH') && ($permission->{'author'})) { + my ($current,$newval,@possibles,@managers); + my %userenv = + &Apache::lonnet::userenvironment($env{'user.domain'}, + $env{'user.name'}, + 'authormanagers'); + $current = $userenv{'authormanagers'}; + @possibles = &Apache::loncommon::get_env_multiple('form.custommanagers'); + if (@possibles) { + my %ca_roles = &Apache::lonnet::get_my_roles(undef,undef,undef, + ['active','future'],['ca']); + if (keys(%ca_roles)) { + foreach my $user (@possibles) { + if ($user =~ /^($match_username):($match_domain)$/) { + if (exists($ca_roles{$user.':ca'})) { + unless ($user eq $env{'user.name'}.':'.$env{'user.domain'}) { + push(@managers,$user); + } + } + } + } + if (@managers) { + $newval = join(',',sort(@managers)); + } + } + } + if ($current eq $newval) { + $output = &mt('No changes made to management of co-author roles'); + } else { + my $chgresult = + &Apache::lonnet::put('environment',{'authormanagers' => $newval}, + $env{'user.domain'},$env{'user.name'}); + if ($chgresult eq 'ok') { + &Apache::lonnet::appenv({'environment.authormanagers' => $newval}); + my (@adds,@dels); + if ($newval eq '') { + @dels = split(/,/,$current); + } elsif ($current eq '') { + @adds = @managers; + } else { + my @old = split(/,/,$current); + my @diffs = &Apache::loncommon::compare_arrays(\@old,\@managers); + if (@diffs) { + foreach my $user (@diffs) { + if (grep(/^\Q$user\E$/,@old)) { + push(@dels,$user); + } elsif (grep(/^\Q$user\E$/,@managers)) { + push(@adds,$user); + } + } + } + } + my $key = "internal.manager./$env{'user.domain'}/$env{'user.name'}"; + if (@dels) { + foreach my $user (@dels) { + if ($user =~ /^($match_username):($match_domain)$/) { + &Apache::lonnet::del('environment',[$key],$2,$1); + } + } + } + if (@adds) { + foreach my $user (@adds) { + if ($user =~ /^($match_username):($match_domain)$/) { + &Apache::lonnet::put('environment',{$key => 1},$2,$1); + } + } + } + if ($newval eq '') { + $output = &mt('Management of co-authors set to be author-only'); + } else { + $output .= &mt('Co-authors who can manage co-author roles set to: [_1]', + '
'.join(', ',map { &Apache::loncommon::plainname(split(':',$_))." ($_)"; } @managers)); + } + } + } + } else { + $output = ''. + &mt('You do not have permission to perform this action'). + ''; + } + return $output; +} + # ================================================================ Main Handler sub handler { my $r = shift; @@ -4599,12 +5632,17 @@ sub handler { $crstype = &Apache::loncommon::course_type(); } elsif ($env{'request.role'} =~ /^au\./) { $context = 'author'; + } elsif ($env{'request.role'} =~ m{^(ca|aa)\./$match_domain/$match_username$}) { + $context = 'coauthor'; } else { $context = 'domain'; } my ($permission,$allowed) = &Apache::lonuserutils::get_permission($context,$crstype); + if (($context eq 'coauthor') && ($allowed)) { + $context = 'author'; + } if ($allowed) { my @allhelp; @@ -4629,7 +5667,7 @@ sub handler { if (&Apache::lonnet::auto_run($cnum,$cdom) && (($permission->{'cusr'}) || ($permission->{'view'}))) { push(@allhelp,'Course_Automated_Enrollment'); } - if ($permission->{'selfenrolladmin'}) { + if (($permission->{'selfenrolladmin'}) || ($permission->{'selfenrollview'})) { push(@allhelp,'Course_Approve_Selfenroll'); } } @@ -4642,6 +5680,13 @@ sub handler { } elsif ($context eq 'author') { push(@allhelp,('Author_Change_Privileges','Author_Create_Coauthor_List', 'Author_View_Coauthor_List','Author_User_Logs')); + } elsif ($context eq 'coauthor') { + if ($permission->{'cusr'}) { + push(@allhelp,('Author_Change_Privileges','Author_Create_Coauthor_List', + 'Author_View_Coauthor_List','Author_User_Logs')); + } elsif ($permission->{'view'}) { + push(@allhelp,'Author_View_Coauthor_List'); + } } else { if ($permission->{'cusr'}) { push(@allhelp,'Domain_Change_Privileges'); @@ -4668,7 +5713,8 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['action','state','callingform','roletype','showrole','bulkaction','popup','phase', - 'username','domain','srchterm','srchdomain','srchin','srchby','srchtype','queue']); + 'username','domain','srchterm','srchdomain','srchin','srchby','srchtype','queue', + 'forceedit']); &Apache::lonhtmlcommon::clear_breadcrumbs(); my $args; my $brcrum = []; @@ -4683,6 +5729,9 @@ sub handler { if ($context eq 'course') { $r->internal_redirect('/adm/viewclasslist'); return OK; + } elsif ($context eq 'coauthor') { + $r->internal_redirect('/adm/viewcoauthors'); + return OK; } $env{'user.error.msg'}= "/adm/createuser:cst:0:0:Cannot create/modify user data ". @@ -4731,16 +5780,41 @@ sub handler { if (! exists($env{'form.state'})) { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } elsif ($env{'form.state'} eq 'got_file') { - &Apache::lonuserutils::print_upload_manager_form($r,$context,$permission, - $crstype,$showcredits); + my $result = + &Apache::lonuserutils::print_upload_manager_form($r,$context, + $permission, + $crstype,$showcredits); + if ($result eq 'missingdata') { + delete($env{'form.state'}); + &Apache::lonuserutils::print_first_users_upload_form($r,$context); + } } elsif ($env{'form.state'} eq 'enrolling') { if ($env{'form.datatoken'}) { - &Apache::lonuserutils::upfile_drop_add($r,$context,$permission, - $showcredits); + my $result = &Apache::lonuserutils::upfile_drop_add($r,$context, + $permission, + $showcredits); + if ($result eq 'missingdata') { + delete($env{'form.state'}); + &Apache::lonuserutils::print_first_users_upload_form($r,$context); + } elsif ($result eq 'invalidhome') { + $env{'form.state'} = 'got_file'; + delete($env{'form.lcserver'}); + my $result = + &Apache::lonuserutils::print_upload_manager_form($r,$context,$permission, + $crstype,$showcredits); + if ($result eq 'missingdata') { + delete($env{'form.state'}); + &Apache::lonuserutils::print_first_users_upload_form($r,$context); + } + } + } else { + delete($env{'form.state'}); + &Apache::lonuserutils::print_first_users_upload_form($r,$context); } } else { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } + $r->print(''); } elsif (((($env{'form.action'} eq 'singleuser') || ($env{'form.action'} eq 'singlestudent')) && ($permission->{'cusr'})) || (($env{'form.action'} eq 'singleuser') && ($permission->{'view'})) || @@ -4846,7 +5920,7 @@ sub handler { &print_useraccesslogs_display($r,$ccuname,$ccdomain,$permission,$brcrum); } } elsif ($env{'form.phase'} eq 'update_user_data') { - &update_user_data($r,$context,$crstype,$brcrum,$showcredits); + &update_user_data($r,$context,$crstype,$brcrum,$showcredits,$permission); } else { &print_username_entry_form($r,$context,undef,$srch,undef,$crstype, $brcrum,$permission); @@ -5144,8 +6218,9 @@ sub handler { ''.&mt('You do not have permission to modify dates or sections for users').''); } } elsif ($env{'form.action'} eq 'selfenroll') { - if ($permission->{selfenrolladmin}) { - my %currsettings = ( + my %currsettings; + if ($permission->{selfenrolladmin} || $permission->{selfenrollview}) { + %currsettings = ( selfenroll_types => $env{'course.'.$cid.'.internal.selfenroll_types'}, selfenroll_registered => $env{'course.'.$cid.'.internal.selfenroll_registered'}, selfenroll_section => $env{'course.'.$cid.'.internal.selfenroll_section'}, @@ -5161,6 +6236,8 @@ sub handler { default_enrollment_end_date => $env{'course.'.$cid.'.default_enrollment_end_date'}, uniquecode => $env{'course.'.$cid.'.internal.uniquecode'}, ); + } + if ($permission->{selfenrolladmin}) { push(@{$brcrum}, {href => '/adm/createuser?action=selfenroll', text => "Configure Self-enrollment", @@ -5181,6 +6258,16 @@ sub handler { $r->print('

'.&mt('Self-enrollment with a student role').'

'."\n"); &update_selfenroll_config($r,$cid,$cdom,$cnum,$context,$crstype,\%currsettings); } + } elsif ($permission->{selfenrollview}) { + push(@{$brcrum}, + {href => '/adm/createuser?action=selfenroll', + text => "View Self-enrollment configuration", + help => 'Course_Self_Enrollment'}); + $args = { bread_crumbs => $brcrum, + bread_crumbs_component => 'Self-enrollment Settings'}; + $r->print(&header(undef,$args)); + $r->print('

'.&mt('Self-enrollment with a student role').'

'."\n"); + &print_selfenroll_menu($r,'course',$cid,$cdom,$cnum,\%currsettings,'',1); } else { $r->print(&header(undef,{'no_nav_bar' => 1}). ''.&mt('You do not have permission to configure self-enrollment').''); @@ -5224,7 +6311,8 @@ sub handler { ''.&mt('You do not have permission to view change logs').''); } } elsif ($env{'form.action'} eq 'helpdesk') { - if (($permission->{'owner'}) || ($permission->{'co-owner'})) { + if (($permission->{'owner'} || $permission->{'co-owner'}) && + ($permission->{'cusr'} || $permission->{'view'})) { if ($env{'form.state'} eq 'process') { if ($permission->{'owner'}) { &update_helpdeskaccess($r,$permission,$brcrum); @@ -5238,6 +6326,84 @@ sub handler { $r->print(&header(undef,{'no_nav_bar' => 1}). ''.&mt('You do not have permission to view helpdesk access').''); } + } elsif ($env{'form.action'} eq 'rolerequests') { + if ($permission->{cusr} || $permission->{view}) { + &print_queued_roles($r,$context,$permission,$brcrum); + } + } elsif ($env{'form.action'} eq 'queuedroles') { + if (($permission->{cusr}) && ($context eq 'domain')) { + if (&show_role_requests($context,$env{'request.role.domain'})) { + if ($env{'form.state'} eq 'done') { + &process_pendingroles($r,$context,$permission,$brcrum); + } else { + &print_pendingroles($r,$context,$permission,$brcrum); + } + } else { + $r->print(&header(undef,{'no_nav_bar' => 1}). + ''.&mt('Domain coordinator approval of requests from other domains for assignment of roles to users from this domain not in use.').''); + } + } else { + $r->print(&header(undef,{'no_nav_bar' => 1}). + ''.&mt('You do not have permission to view queued requests from other domains for assignment of roles to users from this domain.').''); + } + } elsif ($env{'form.action'} eq 'camanagers') { + if (($permission->{cusr}) && ($context eq 'author')) { + push(@{$brcrum}, + {href => '/adm/createuser?action=camanagers', + text => 'Co-authors who manage', + help => 'Author_Manage_Coauthors'}); + if ($env{'form.state'} eq 'process') { + push(@{$brcrum}, + {href => '/adm/createuser?action=camanagers', + text => 'Result', + help => 'Author_Manage_Coauthors'}); + } + $args = { bread_crumbs => $brcrum }; + $r->print(&header(undef,$args)); + my $coursedesc = $env{'course.'.$cid.'.description'}; + if (!exists($env{'form.state'})) { + $r->print('

'.&mt('Co-author Management').'

'."\n". + &display_coauthor_managers($permission)); + } elsif ($env{'form.state'} eq 'process') { + $r->print('

'.&mt('Co-author Management Update Result').'

'."\n". + &update_coauthor_managers($permission)); + } + } + } elsif (($env{'form.action'} eq 'calist') && ($context eq 'author')) { + if ($permission->{'cusr'}) { + my ($role,$audom,$auname,$canview,$canedit) = + &Apache::lonviewcoauthors::get_allowable(); + if (($canedit) && ($env{'form.forceedit'})) { + &Apache::lonviewcoauthors::get_editor_crumbs($brcrum,'/adm/createuser'); + my $args = { 'bread_crumbs' => $brcrum }; + $r->print(&Apache::loncommon::start_page('Configure co-author listing',undef, + $args). + &Apache::lonviewcoauthors::edit_settings($audom,$auname,$role, + '/adm/createuser')); + } else { + push(@{$brcrum}, + {href => '/adm/createuser?action=calist', + text => 'Coauthor-viewable list', + help => 'Author_List_Coauthors'}); + my $args = { 'bread_crumbs' => $brcrum }; + $r->print(&Apache::loncommon::start_page('Coauthor-viewable list',undef, + $args)); + my %viewsettings = + &Apache::lonviewcoauthors::retrieve_view_settings($auname,$audom,$role); + if ($viewsettings{'show'} eq 'none') { + $r->print('

'.&mt('Coauthor-viewable listing').'

'. + '

'. + &mt('Listing of co-authors not enabled for this Authoring Space'). + '

'); + } else { + &Apache::lonviewcoauthors::print_coauthors($r,$auname,$audom,$role, + '/adm/createuser',\%viewsettings); + } + } + } else { + $r->internal_redirect('/adm/viewcoauthors'); + return OK; + } } else { $bread_crumbs_component = 'User Management'; $args = { bread_crumbs => $brcrum, @@ -5344,6 +6510,15 @@ function updateCols(caller) { document.getElementById('showcolstart').checked = false; document.getElementById('showcolend').checked = false; } + if (context == 'author') { + if (document.studentform.Status.options[document.studentform.Status.selectedIndex].value == 'Expired') { + document.getElementById('showcolmanager').checked = false; + document.getElementById('showcolmanager').disabled = 'disabled'; + } else if (document.studentform.showrole.options[document.studentform.showrole.selectedIndex].value != 'aa') { + document.getElementById('showcolmanager').checked = true; + document.getElementById('showcolmanager').disabled = ''; + } + } } } if (caller == 'output') { @@ -5429,6 +6604,15 @@ function updateCols(caller) { } } } + if (context == 'author') { + if (document.studentform.showrole.options[document.studentform.showrole.selectedIndex].value == 'aa') { + document.getElementById('showcolmanager').checked = false; + document.getElementById('showcolmanager').disabled = 'disabled'; + } else if (document.studentform.Status.options[document.studentform.Status.selectedIndex].value != 'Expired') { + document.getElementById('showcolmanager').checked = true; + document.getElementById('showcolmanager').disabled = ''; + } + } } return; } @@ -5489,6 +6673,7 @@ sub print_main_menu { listusers => 'Show and manage users in this community.', }, ); + if ($linkcontext eq 'domain') { unless ($permission->{'cusr'}) { $links{'domain'}{'singleuser'} = 'View a User'; @@ -5654,7 +6839,8 @@ sub print_main_menu { icon => 'helpdesk-access.png', #help => 'Course_Helpdesk_Access', url => '/adm/createuser?action=helpdesk', - permission => ($permission->{'owner'} || $permission->{'co-owner'}), + permission => (($permission->{'owner'} || $permission->{'co-owner'}) && + ($permission->{'view'} || $permission->{'cusr'})), linktitle => 'Helpdesk access options', }, { @@ -5689,7 +6875,7 @@ sub print_main_menu { icon => 'selfenrl-queue.png', #help => 'Course_Approve_Selfenroll', url => '/adm/createuser?action=selfenrollqueue', - permission => $permission->{'selfenrolladmin'}, + permission => $permission->{'selfenrolladmin'} || $permission->{'selfenrollview'}, linktitle =>'Approve or reject enrollment requests.', }, ); @@ -5716,7 +6902,7 @@ sub print_main_menu { icon => 'self_enroll.png', #help => 'Course_Self_Enrollment', url => '/adm/createuser?action=selfenroll', - permission => $permission->{'selfenrolladmin'}, + permission => $permission->{'selfenrolladmin'} || $permission->{'selfenrollview'}, linktitle => 'Configure user self-enrollment.', }, ); @@ -5731,6 +6917,44 @@ sub print_main_menu { permission => $permission->{'cusr'}, linktitle => 'View change log.', }, + { + linktext => 'Co-author Managers', + icon => 'helpdesk-access.png', + #help => 'Coauthor_Management', + url => '/adm/createuser?action=camanagers', + permission => $permission->{'author'}, + linktitle => 'Assign/Revoke right to manage co-author roles', + }, + { + linktext => 'Configure Coauthor Listing', + icon => 'helpdesk-access.png', + #help => 'Coauthor_Settings', + url => '/adm/createuser?action=calist&forceedit=1', + permission => ($permission->{'cusr'}), + linktitle => 'Set availability of coauthor-viewable user listing', + }, + ); + } + push(@{ $menu[2]->{items} }, + { + linktext => 'Role Requests (other domains)', + icon => 'edit-find.png', + #help => 'Role_Requests', + url => '/adm/createuser?action=rolerequests', + permission => $permission->{'cusr'}, + linktitle => 'Role requests for users in other domains', + }, + ); + if (&show_role_requests($context,$env{'request.role.domain'})) { + push(@{ $menu[2]->{items} }, + { + linktext => 'Queued Role Assignments (this domain)', + icon => 'edit-find.png', + #help => 'Role_Approvals', + url => '/adm/createuser?action=queuedroles', + permission => $permission->{'cusr'}, + linktitle => "Role requests for this domain's users", + }, ); } return Apache::lonhtmlcommon::generate_menu(@menu); @@ -5965,8 +7189,7 @@ ENDSCRIPT '// ]]>'."\n". ''."\n". '

'.$lt->{'selfenroll'}.'

'."\n"; - - my $visactions = &cat_visibility(); + my $visactions = &cat_visibility($cdom); my ($cathash,%cattype); my %domconfig = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); if (ref($domconfig{'coursecategories'}) eq 'HASH') { @@ -6129,10 +7352,11 @@ ENDSCRIPT } elsif ($curr_types eq '') { $add_domtitle = &mt('Users in other domain:'); } + my ($trusted,$untrusted) = &Apache::lonnet::trusted_domains('enroll',$cdom); $output .= &Apache::loncommon::start_data_table_row() .'
'.$add_domtitle.'
' .&Apache::loncommon::select_dom_form('','selfenroll_newdom', - $includeempty,$showdomdesc,'','','',$readonly) + $includeempty,$showdomdesc,'',$trusted,$untrusted,$readonly) .'' .'
'.$count.''.&Apache::lonlocal::locallocaltime($roleslog{$id}{'exe_time'}).''.$whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}}.''.$showreqby.''.$changed{$roleslog{$id}{'uname'}.':'.$roleslog{$id}{'udom'}}.''.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).' '.&mt('When').'
'; my $startform = @@ -7277,14 +8541,10 @@ sub userlogdisplay_navlinks { sub role_display_filter { my ($context,$formname,$cdom,$cnum,$curr,$version,$crstype) = @_; - my $lctype; - if ($context eq 'course') { - $lctype = lc($crstype); - } my $nolink = 1; my $output = '
'. ''.&mt('Actions/page:').'
'. - &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + &Apache::lonmeta::selectbox('show',$curr->{'show'},'',undef, (&mt('all'),5,10,20,50,100,1000,10000)). '
  
'; my $startform = @@ -7308,7 +8568,7 @@ sub role_display_filter { if ($curr->{'role'} eq 'any') { $output .= ' selected="selected"'; } - $output .= '>'.&mt('Any').''."\n"; + $output .= '>'.&mt('Any').''."\n"; my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype); foreach my $role (@roles) { my $plrole; @@ -7329,12 +8589,12 @@ sub role_display_filter { &mt('Context:').'
' - .'
'. ''.&mt('Changes/page:').'
'. - &Apache::lonmeta::selectbox('show',$curr->{'show'},undef, + &Apache::lonmeta::selectbox('show',$curr->{'show'},'',undef, (&mt('all'),5,10,20,50,100,1000,10000)). '
  
'; + my @possapprovals = ('any','none','domain','user'); + my %apptxt = &approval_types(); + $output .= ''. + '  '. + ''. + &mt('Approvals:').'
'; # Update Display button $output .= '

' @@ -7378,12 +8650,14 @@ sub rolechg_contexts { %lt = &Apache::lonlocal::texthash ( any => 'Any', automated => 'Automated Enrollment', + chgtype => 'Enrollment Type/Lock Change', updatenow => 'Roster Update', createcourse => 'Course Creation', course => 'User Management in course', domain => 'User Management in domain', selfenroll => 'Self-enrolled', requestcourses => 'Course Request', + ltienroll => 'Enrollment via LTI', ); if ($crstype eq 'Community') { $lt{'createcourse'} = &mt('Community Creation'); @@ -7403,11 +8677,21 @@ sub rolechg_contexts { any => 'Any', domain => 'User Management in domain', author => 'User Management by author', + coauthor => 'User Management by coauthor', ); } return %lt; } +sub approval_types { + return &Apache::lonlocal::texthash ( + any => 'Any', + none => 'No approval needed', + user => 'Role recipient approval', + domain => 'Domain coordinator approval', + ); +} + sub print_helpdeskaccess_display { my ($r,$permission,$brcrum) = @_; my $formname = 'helpdeskaccess'; @@ -7814,6 +9098,67 @@ ENDJS return; } +sub print_queued_roles { + my ($r,$context,$permission,$brcrum) = @_; + push (@{$brcrum}, + {href => '/adm/createuser?action=rolerequests', + text => 'Role Requests (other domains)', + help => ''}); + my $bread_crumbs_component = 'Role Requests'; + my $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + # print page header + $r->print(&header('',$args)); + my ($dom,$cnum); + $dom = $env{'request.role.domain'}; + if ($context eq 'course') { + if ($env{'request.course.id'}) { + if (&Apache::loncommon::course_type() eq 'Community') { + $context = 'community'; + } + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + } + } elsif ($context eq 'author') { + $cnum = $env{'user.name'}; + } + $r->print(&Apache::loncoursequeueadmin::display_queued_requests('othdomqueue',$dom,$cnum,$context)); + return; +} + +sub print_pendingroles { + my ($r,$context,$permission,$brcrum) = @_; + push (@{$brcrum}, + {href => '/adm/createuser?action=queuedroles', + text => 'Queued Role Assignments (users in this domain)', + help => ''}); + my $bread_crumbs_component = 'Queued Role Assignments'; + my $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + # print page header + $r->print(&header('',$args)); + $r->print(&Apache::loncoursequeueadmin::display_queued_requests('othdomaction',$env{'request.role.domain'},'','domain')); + return; +} + +sub process_pendingroles { + my ($r,$context,$permission,$brcrum) = @_; + push (@{$brcrum}, + {href => '/adm/createuser?action=queuedroles', + text => 'Queued Role Assignments (users in this domain)', + help => ''}, + {href => '/adm/createuser?action=processrolereq', + text => 'Process Queue', + help => ''}); + my $bread_crumbs_component = 'Queued Role Assignments'; + my $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + # print page header + $r->print(&header('',$args)); + $r->print(&Apache::loncoursequeueadmin::update_request_queue('othdombydc', + $env{'request.role.domain'})); + return; +} + sub domain_adhoc_access { my ($roles,$domcurrent,$accesstypes,$usertypes,$othertitle) = @_; my %domusage; @@ -9147,7 +10492,7 @@ sub course_level_dc { ENDTIMEENTRY $otheritems .= &Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table()."\n"; - return $cb_jscript.$header.$hiddenitems.$otheritems; + return $cb_jscript.$hiddenitems.$header.$otheritems; } sub update_selfenroll_config { @@ -9483,7 +10828,7 @@ sub update_selfenroll_config { } else { $r->print(&mt('No changes were made to the existing self-enrollment settings in this course.')); } - my $visactions = &cat_visibility(); + my $visactions = &cat_visibility($cdom); my ($cathash,%cattype); my %domconfig = &Apache::lonnet::get_dom('configuration',['coursecategories'],$cdom); if (ref($domconfig{'coursecategories'}) eq 'HASH') { 500 Internal Server Error

Internal Server Error

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

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

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