--- loncom/interface/loncreateuser.pm 2010/12/05 21:58:11 1.329.2.7 +++ loncom/interface/loncreateuser.pm 2013/07/03 04:04:13 1.379 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.329.2.7 2010/12/05 21:58:11 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.379 2013/07/03 04:04:13 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -70,7 +70,6 @@ use Apache::lonlocal; use Apache::longroup; use Apache::lonuserutils; use Apache::loncoursequeueadmin; -use Apache::lonrequestcourse; use LONCAPA qw(:DEFAULT :match); my $loginscript; # piece of javascript used in two separate instances @@ -112,77 +111,53 @@ 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(); @@ -190,29 +165,71 @@ END_SCRIPT if (&Apache::lonnet::allowed('mut',$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". + ' '.$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"; + } + } $output .= &Apache::loncommon::end_data_table(); return $output; } @@ -220,10 +237,11 @@ END_SCRIPT sub build_tools_display { my ($ccuname,$ccdomain,$context) = @_; my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay, - $colspan); + $colspan,$isadv,%domconfig); 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", @@ -233,6 +251,7 @@ sub build_tools_display { 'official' => 'Can request creation of official courses', 'unofficial' => 'Can request creation of unofficial courses', 'community' => 'Can request creation of communities', + 'requestauthor' => 'Can request author space', ); if ($context eq 'requestcourses') { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, @@ -244,10 +263,24 @@ sub build_tools_display { %reqtitles = &courserequest_titles(); %reqdisplay = &courserequest_display(); $colspan = ' colspan="2"'; + %domconfig = + &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain); + $isadv = &Apache::lonnet::is_advanced_user($ccuname,$ccdomain); + } 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, @@ -257,7 +290,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 = ''; } @@ -267,6 +305,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 = @@ -288,9 +332,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); - $curroption = $userenv{$context.'.'.$item}; + my $envkey = $context.'.'.$item; + if ($context eq 'requestauthor') { + $envkey = $context; + } + if ($userenv{$envkey} ne '') { + $curroption = $userenv{$envkey}; + } else { + my (@inststatuses); + 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'; } @@ -327,28 +390,36 @@ 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. ''; @@ -444,6 +515,17 @@ sub coursereq_externaluser { return $output; } +sub domainrole_req { + my ($ccuname,$ccdomain) = @_; + return '

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

'."\n". + &Apache::loncommon::start_data_table(). + &build_tools_display($ccuname,$ccdomain, + 'requestauthor'). + &Apache::loncommon::end_data_table(); +} + sub courserequest_titles { my %titles = &Apache::lonlocal::texthash ( official => 'Official', @@ -467,13 +549,86 @@ sub courserequest_display { return %titles; } +sub requestauthor_titles { + my %titles = &Apache::lonlocal::texthash ( + norequest => 'Not allowed', + approval => 'Approval by Dom. Coord.', + automatic => 'Automatic approval', + ); + return %titles; + +} + +sub requestauthor_display { + my %titles = &Apache::lonlocal::texthash ( + approval => 'Yes, need approval', + automatic => 'Yes, automatic approval', + norequest => 'No', + ); + return %titles; +} + +sub curr_requestauthor { + my ($uname,$udom,$isadv,$inststatuses,$domconfig) = @_; + return unless ((ref($inststatuses) eq 'ARRAY') && (ref($domconfig) eq 'HASH')); + if ($uname eq '' || $udom eq '') { + $uname = $env{'user.name'}; + $udom = $env{'user.domain'}; + $isadv = $env{'user.adv'}; + } + my (%userenv,%settings,$val); + my @options = ('automatic','approval'); + %userenv = + &Apache::lonnet::userenvironment($udom,$uname,'requestauthor','inststatus'); + if ($userenv{'requestauthor'}) { + $val = $userenv{'requestauthor'}; + @{$inststatuses} = ('_custom_'); + } else { + my %alltasks; + if (ref($domconfig->{'requestauthor'}) eq 'HASH') { + %settings = %{$domconfig->{'requestauthor'}}; + if (($isadv) && ($settings{'_LC_adv'} ne '')) { + $val = $settings{'_LC_adv'}; + @{$inststatuses} = ('_LC_adv_'); + } else { + if ($userenv{'inststatus'} ne '') { + @{$inststatuses} = split(',',$userenv{'inststatus'}); + } else { + @{$inststatuses} = ('default'); + } + foreach my $status (@{$inststatuses}) { + if (exists($settings{$status})) { + my $value = $settings{$status}; + next unless ($value); + unless (exists($alltasks{$value})) { + if (ref($alltasks{$value}) eq 'ARRAY') { + unless(grep(/^\Q$status\E$/,@{$alltasks{$value}})) { + push(@{$alltasks{$value}},$status); + } + } else { + @{$alltasks{$value}} = ($status); + } + } + } + } + foreach my $option (@options) { + if ($alltasks{$option}) { + $val = $option; + last; + } + } + } + } + } + return $val; +} + # =================================================================== Phase one sub print_username_entry_form { my ($r,$context,$response,$srch,$forcenewuser,$crstype,$brcrum) = @_; my $defdom=$env{'request.role.domain'}; my $formtoset = 'crtuser'; - my $is_custom = &Apache::loncommon::needs_gci_custom(); if (exists($env{'form.startrolename'})) { $formtoset = 'docustom'; $env{'form.rolename'} = $env{'form.startrolename'}; @@ -495,12 +650,6 @@ sub print_username_entry_form { && (&Apache::lonnet::allowed('mcr','/'))) { $jscript .= &customrole_javascript(); } - my $title = 'User Management'; - if ($context eq 'course') { - if ($is_custom) { - $title = 'Enrollment and Student Activity'; - } - } my $helpitem = 'Course_Change_Privileges'; if ($env{'form.action'} eq 'custom') { $helpitem = 'Course_Editing_Custom_Roles'; @@ -529,7 +678,7 @@ sub print_username_entry_form { my $args = {bread_crumbs => $brcrum, bread_crumbs_component => 'User Management', add_entries => \%loaditems,}; - $r->print(&Apache::loncommon::start_page($title,$jscript,$args)); + $r->print(&Apache::loncommon::start_page('User Management',$jscript,$args)); my %lt=&Apache::lonlocal::texthash( 'srst' => 'Search for a user and enroll as a student', @@ -541,6 +690,7 @@ sub print_username_entry_form { 'nr' => "role name", 'cre' => "Next", ); + if ($env{'form.action'} eq 'custom') { if (&Apache::lonnet::allowed('mcr','/')) { my $newroletext = &mt('Define new custom role:'); @@ -635,7 +785,6 @@ END sub entry_form { my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype) = @_; - my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); my ($usertype,$inexact); if (ref($srch) eq 'HASH') { if (($srch->{'srchin'} eq 'dom') && @@ -643,9 +792,10 @@ sub entry_form { ($srch->{'srchtype'} eq 'exact') && ($srch->{'srchdomain'} ne '') && ($srch->{'srchterm'} ne '')) { + my (%curr_rules,%got_rules); my ($rules,$ruleorder) = &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username'); - $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules); + $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules,\%curr_rules,\%got_rules); } else { $inexact = 1; } @@ -671,7 +821,7 @@ $userpicker ENDBLOCK if ($env{'form.phase'} eq '') { my $defdom=$env{'request.role.domain'}; - my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain','',1); + my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain'); my %lt=&Apache::lonlocal::texthash( 'enro' => 'Enroll one student', 'enrm' => 'Enroll one member', @@ -720,7 +870,7 @@ $showresponse - + @@ -739,19 +889,13 @@ sub user_modification_js { '."\n"; my %breadcrumb_text = &singleuser_breadcrumb($crstype); + push (@{$brcrum}, + {href => "javascript:backPage(document.userupdate)", + text => $breadcrumb_text{'search'}, + faq => 282, + bug => 'Instructor Interface',} + ); + if ($env{'form.prevphase'} eq 'userpicked') { + push(@{$brcrum}, + {href => "javascript:backPage(document.userupdate,'get_user_info','select')", + text => $breadcrumb_text{'userpicked'}, + faq => 282, + bug => 'Instructor Interface',}); + } my $helpitem = 'Course_Change_Privileges'; if ($env{'form.action'} eq 'singlestudent') { $helpitem = 'Course_Add_Student'; } - my $bread_crumbs_component = 'User Management'; - if ($context eq 'course') { - if ($is_custom) { - $bread_crumbs_component = 'Enrollment and Student Activity'; - } - } push(@{$brcrum}, {href => "javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')", text => $breadcrumb_text{'modify'}, @@ -2244,13 +2424,12 @@ sub update_user_data { faq => 282, bug => 'Instructor Interface', help => $helpitem}); - my $args = {bread_crumbs => $brcrum, - bread_crumbs_component => $bread_crumbs_component}; + my $args = {bread_crumbs => $brcrum, + bread_crumbs_component => 'User Management'}; if ($env{'form.popup'}) { $args->{'no_nav_bar'} = 1; } $r->print(&Apache::loncommon::start_page($title,$jscript,$args)); - $r->print(&update_result_form($uhome)); # Check Inputs if (! $env{'form.ccuname'} ) { @@ -2311,17 +2490,25 @@ sub update_user_data { # If they are creating a new user but have not specified login # information this will be caught below. } else { - $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink); - return; + $r->print($error.&mt('Invalid login mode or password').$end.$rtnlink); + return; } $r->print('

'.&mt('User [_1] in domain [_2]', - $env{'form.ccuname'}, $env{'form.ccdomain'}).'

'); + $env{'form.ccuname'}.' ('.&Apache::loncommon::plainname($env{'form.ccuname'}, + $env{'form.ccdomain'}).')', $env{'form.ccdomain'}).''); + my %prog_state = &Apache::lonhtmlcommon::Create_PrgWin($r,2); + my (%alerts,%rulematch,%inst_results,%curr_rules); - my @usertools = ('aboutme','blog','portfolio'); + my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id'); + my @usertools = ('aboutme','blog','webdav','portfolio'); my @requestcourses = ('official','unofficial','community'); + my @requestauthor = ('requestauthor'); my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'}); + my %canmodify_status = + &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'}, + ['inststatus']); if ($env{'form.makeuser'}) { $r->print('

'.&mt('Creating new account.').'

'); # Check for the authentication mode and password @@ -2371,6 +2558,7 @@ sub update_user_data { } } } + &Apache::lonhtmlcommon::Increment_PrgWin($r, \%prog_state); # Call modifyuser my $result = &Apache::lonnet::modifyuser ($env{'form.ccdomain'},$env{'form.ccuname'},$env{'form.cid'}, @@ -2381,49 +2569,62 @@ sub update_user_data { $r->print(&mt('Generating user').': '.$result); $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'}, $env{'form.ccdomain'}); - my (%changeHash,%newcustom,%changed); + my (%changeHash,%newcustom,%changed,%changedinfo); if ($uhome ne 'no_host') { - if ($env{'form.customquota'} == 1) { - if ($env{'form.portfolioquota'} eq '') { - $newcustom{'quota'} = 0; - } else { - $newcustom{'quota'} = $env{'form.portfolioquota'}; - $newcustom{'quota'} =~ s/[^\d\.]//g; + if ($context eq 'domain') { + foreach my $name ('portfolio','author') { + if ($env{'form.custom_'.$name.'quota'} == 1) { + if ($env{'form.'.$name.'quota'} eq '') { + $newcustom{$name.'quota'} = 0; + } else { + $newcustom{$name.'quota'} = $env{'form.'.$name.'quota'}; + $newcustom{$name.'quota'} =~ s/[^\d\.]//g; + } + if ("a_admin($newcustom{$name.'quota'},\%changeHash,$name)) { + $changed{$name.'quota'} = 1; + } + } } - $changed{'quota'} = "a_admin($newcustom{'quota'},\%changeHash); - } - foreach my $item (@usertools) { - if ($env{'form.custom'.$item} == 1) { - $newcustom{$item} = $env{'form.tools_'.$item}; - $changed{$item} = &tool_admin($item,$newcustom{$item}, - \%changeHash,'tools'); + foreach my $item (@usertools) { + if ($env{'form.custom'.$item} == 1) { + $newcustom{$item} = $env{'form.tools_'.$item}; + $changed{$item} = &tool_admin($item,$newcustom{$item}, + \%changeHash,'tools'); + } } - } - foreach my $item (@requestcourses) { - $newcustom{$item} = $env{'form.crsreq_'.$item}; - if ($env{'form.crsreq_'.$item} eq 'autolimit') { - $newcustom{$item} .= '='; - unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) { - $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'}; + foreach my $item (@requestcourses) { + if ($env{'form.custom'.$item} == 1) { + $newcustom{$item} = $env{'form.crsreq_'.$item}; + if ($env{'form.crsreq_'.$item} eq 'autolimit') { + $newcustom{$item} .= '='; + unless ($env{'form.crsreq_'.$item.'_limit'} =~ /\D/) { + $newcustom{$item} .= $env{'form.crsreq_'.$item.'_limit'}; + } + } + $changed{$item} = &tool_admin($item,$newcustom{$item}, + \%changeHash,'requestcourses'); } } - $changed{$item} = &tool_admin($item,$newcustom{$item}, - \%changeHash,'requestcourses'); - } - if (exists($env{'form.inststatus'})) { - my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus'); - if (@inststatuses > 0) { - $changeHash{'inststatus'} = join(',',@inststatuses); - $changed{'inststatus'} = $changeHash{'inststatus'}; + if ($env{'form.customrequestauthor'} == 1) { + $newcustom{'requestauthor'} = $env{'form.requestauthor'}; + $changed{'requestauthor'} = &tool_admin('requestauthor', + $newcustom{'requestauthor'}, + \%changeHash,'requestauthor'); + } + } + if ($canmodify_status{'inststatus'}) { + if (exists($env{'form.inststatus'})) { + my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus'); + if (@inststatuses > 0) { + $changeHash{'inststatus'} = join(',',@inststatuses); + $changed{'inststatus'} = $changeHash{'inststatus'}; + } } } if (keys(%changed)) { - $changeHash{'firstname'} = $env{'form.cfirstname'}; - $changeHash{'middlename'} = $env{'form.cmiddlename'}; - $changeHash{'lastname'} = $env{'form.clastname'}; - $changeHash{'generation'} = $env{'form.cgeneration'}; - $changeHash{'id'} = $env{'form.cid'}; - $changeHash{'permanentemail'} = $env{'form.cpermanentemail'}; + foreach my $item (@userinfo) { + $changeHash{$item} = $env{'form.c'.$item}; + } my $chgresult = &Apache::lonnet::put('environment',\%changeHash, $env{'form.ccdomain'},$env{'form.ccuname'}); @@ -2451,21 +2652,28 @@ sub update_user_data { $r->print($error.&mt('You do not have the authority to modify this users authentification information').'.'.$end); } } + $r->rflush(); # Finish display of header before time consuming actions start + &Apache::lonhtmlcommon::Increment_PrgWin($r,\%prog_state); ## - my (@userroles,%userupdate,$cnum,$cdom,$crstype,$namechanged); + my (@userroles,%userupdate,$cnum,$cdom,$defaultcredits,%namechanged); if ($context eq 'course') { - ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); + ($cnum,$cdom) = + &Apache::lonuserutils::get_course_identity(); $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum); + if ($showcredits) { + $defaultcredits = &Apache::lonuserutils::get_defaultcredits($cdom,$cnum); + } } if (! $env{'form.makeuser'} ) { # Check for need to change my %userenv = &Apache::lonnet::get ('environment',['firstname','middlename','lastname','generation', - 'id','permanentemail','portfolioquota','inststatus','tools.aboutme', - 'tools.blog','tools.portfolio','requestcourses.official', - 'requestcourses.unofficial','requestcourses.community', - 'reqcrsotherdom.official','reqcrsotherdom.unofficial', - 'reqcrsotherdom.community'], + 'id','permanentemail','portfolioquota','authorquota','inststatus', + 'tools.aboutme','tools.blog','tools.webdav','tools.portfolio', + 'requestcourses.official','requestcourses.unofficial', + 'requestcourses.community','reqcrsotherdom.official', + 'reqcrsotherdom.unofficial','reqcrsotherdom.community', + 'requestauthor'], $env{'form.ccdomain'},$env{'form.ccuname'}); my ($tmp) = keys(%userenv); if ($tmp =~ /^(con_lost|error)/i) { @@ -2542,7 +2750,6 @@ sub update_user_data { push(@longroles,&Apache::lonnet::plaintext($role,$crstype)); } } - my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id'); my %canmodify = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},\@userinfo,\@userroles); foreach my $item (@userinfo) { # Strip leading and trailing whitespace @@ -2588,41 +2795,54 @@ sub update_user_data { } } } - my ($quotachanged,$oldportfolioquota,$newportfolioquota,$oldinststatus, - $inststatus,$newinststatus,$oldisdefault,$newisdefault,$olddefquotatext, - $newdefquotatext,%oldaccess,%oldaccesstext,%newaccess,%newaccesstext, - $oldinststatuses,$newinststatuses); - my ($defquota,$settingstatus) = - &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus); - my ($showquota,$showtools,$showrequestcourses,$showinststatus,$showreqotherdom); + my (%quotachanged,%oldquota,%newquota,%olddefquota,%newdefquota, + $oldinststatus,$newinststatus,%oldisdefault,%newisdefault,%oldsettings, + %oldsettingstext,%newsettings,%newsettingstext,@disporder, + %oldsettingstatus,%newsettingstatus); + @disporder = ('inststatus'); + if ($env{'request.role.domain'} eq $env{'form.ccdomain'}) { + push(@disporder,'requestcourses','requestauthor'); + } else { + push(@disporder,'reqcrsotherdom'); + } + push(@disporder,('quota','tools')); + $oldinststatus = $userenv{'inststatus'}; + foreach my $name ('portfolio','author') { + ($olddefquota{$name},$oldsettingstatus{$name}) = + &Apache::loncommon::default_quota($env{'form.ccdomain'},$oldinststatus,$name); + ($newdefquota{$name},$newsettingstatus{$name}) = ($olddefquota{$name},$oldsettingstatus{$name}); + } + my %canshow; if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) { - $showquota = 1; + $canshow{'quota'} = 1; } if (&Apache::lonnet::allowed('mut',$env{'form.ccdomain'})) { - $showtools = 1; + $canshow{'tools'} = 1; } if (&Apache::lonnet::allowed('ccc',$env{'form.ccdomain'})) { - $showrequestcourses = 1; + $canshow{'requestcourses'} = 1; } elsif (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { - $showreqotherdom = 1; + $canshow{'reqcrsotherdom'} = 1; } if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) { - $showinststatus = 1; + $canshow{'inststatus'} = 1; + } + if (&Apache::lonnet::allowed('cau',$env{'form.ccdomain'})) { + $canshow{'requestauthor'} = 1; } my (%changeHash,%changed); - $oldinststatus = $userenv{'inststatus'}; if ($oldinststatus eq '') { - $oldinststatuses = $othertitle; + $oldsettings{'inststatus'} = $othertitle; } else { if (ref($usertypes) eq 'HASH') { - $oldinststatuses = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'}))); + $oldsettings{'inststatus'} = join(', ',map{ $usertypes->{ &unescape($_) }; } (split(/:/,$userenv{'inststatus'}))); } else { - $oldinststatuses = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'}))); + $oldsettings{'inststatus'} = join(', ',map{ &unescape($_); } (split(/:/,$userenv{'inststatus'}))); } } $changeHash{'inststatus'} = $userenv{'inststatus'}; - my %canmodify_inststatus = &Apache::lonuserutils::can_modify_userinfo($context,$env{'form.ccdomain'},['inststatus'],\@userroles); - if ($canmodify_inststatus{'inststatus'}) { + if ($canmodify_status{'inststatus'}) { + $canshow{'inststatus'} = 1; if (exists($env{'form.inststatus'})) { my @inststatuses = &Apache::loncommon::get_env_multiple('form.inststatus'); if (@inststatuses > 0) { @@ -2630,86 +2850,105 @@ sub update_user_data { $changeHash{'inststatus'} = $newinststatus; if ($newinststatus ne $oldinststatus) { $changed{'inststatus'} = $newinststatus; + foreach my $name ('portfolio','author') { + ($newdefquota{$name},$newsettingstatus{$name}) = + &Apache::loncommon::default_quota($env{'form.ccdomain'},$newinststatus,$name); + } } if (ref($usertypes) eq 'HASH') { - $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); + $newsettings{'inststatus'} = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); } else { - $newinststatuses = join(', ',map{ $usertypes->{$_}; } (@inststatuses)); + $newsettings{'inststatus'} = join(', ',@inststatuses); } - } else { - $newinststatus = ''; - $changeHash{'inststatus'} = $newinststatus; - $newinststatuses = $othertitle; - if ($newinststatus ne $oldinststatus) { - $changed{'inststatus'} = $changeHash{'inststatus'}; + } + } else { + $newinststatus = ''; + $changeHash{'inststatus'} = $newinststatus; + $newsettings{'inststatus'} = $othertitle; + if ($newinststatus ne $oldinststatus) { + $changed{'inststatus'} = $changeHash{'inststatus'}; + foreach my $name ('portfolio','author') { + ($newdefquota{$name},$newsettingstatus{$name}) = + &Apache::loncommon::default_quota($env{'form.ccdomain'},$newinststatus,$name); } } } + } elsif ($context ne 'selfcreate') { + $canshow{'inststatus'} = 1; + $newsettings{'inststatus'} = $oldsettings{'inststatus'}; + } + foreach my $name ('portfolio','author') { + $changeHash{$name.'quota'} = $userenv{$name.'quota'}; } - $changeHash{'portfolioquota'} = $userenv{'portfolioquota'}; - if ($userenv{'portfolioquota'} ne '') { - $oldportfolioquota = $userenv{'portfolioquota'}; - if ($env{'form.customquota'} == 1) { - if ($env{'form.portfolioquota'} eq '') { - $newportfolioquota = 0; + if ($context eq 'domain') { + foreach my $name ('portfolio','author') { + if ($userenv{$name.'quota'} ne '') { + $oldquota{$name} = $userenv{$name.'quota'}; + if ($env{'form.custom_'.$name.'quota'} == 1) { + if ($env{'form.'.$name.'quota'} eq '') { + $newquota{$name} = 0; + } else { + $newquota{$name} = $env{'form.'.$name.'quota'}; + $newquota{$name} =~ s/[^\d\.]//g; + } + if ($newquota{$name} != $oldquota{$name}) { + if ("a_admin($newquota{$name},\%changeHash,$name)) { + $changed{$name.'quota'} = 1; + } + } + } else { + if ("a_admin('',\%changeHash,$name)) { + $changed{$name.'quota'} = 1; + $newquota{$name} = $newdefquota{$name}; + $newisdefault{$name} = 1; + } + } } else { - $newportfolioquota = $env{'form.portfolioquota'}; - $newportfolioquota =~ s/[^\d\.]//g; + $oldisdefault{$name} = 1; + $oldquota{$name} = $olddefquota{$name}; + if ($env{'form.custom_'.$name.'quota'} == 1) { + if ($env{'form.'.$name.'quota'} eq '') { + $newquota{$name} = 0; + } else { + $newquota{$name} = $env{'form.'.$name.'quota'}; + $newquota{$name} =~ s/[^\d\.]//g; + } + if ("a_admin($newquota{$name},\%changeHash,$name)) { + $changed{$name.'quota'} = 1; + } + } else { + $newquota{$name} = $newdefquota{$name}; + $newisdefault{$name} = 1; + } } - if ($newportfolioquota != $oldportfolioquota) { - $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash); + if ($oldisdefault{$name}) { + $oldsettingstext{'quota'}{$name} = &get_defaultquota_text($oldsettingstatus{$name}); } - } else { - $changed{'quota'} = "a_admin('',\%changeHash); - $newportfolioquota = $defquota; - $newisdefault = 1; - } - } else { - $oldisdefault = 1; - $oldportfolioquota = $defquota; - if ($env{'form.customquota'} == 1) { - if ($env{'form.portfolioquota'} eq '') { - $newportfolioquota = 0; - } else { - $newportfolioquota = $env{'form.portfolioquota'}; - $newportfolioquota =~ s/[^\d\.]//g; + if ($newisdefault{$name}) { + $newsettingstext{'quota'}{$name} = &get_defaultquota_text($newsettingstatus{$name}); } - $changed{'quota'} = "a_admin($newportfolioquota,\%changeHash); + } + &tool_changes('tools',\@usertools,\%oldsettings,\%oldsettingstext,\%userenv, + \%changeHash,\%changed,\%newsettings,\%newsettingstext); + if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) { + &tool_changes('requestcourses',\@requestcourses,\%oldsettings,\%oldsettingstext, + \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext); + &tool_changes('requestauthor',\@requestauthor,\%oldsettings,\%oldsettingstext,\%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext); } else { - $newportfolioquota = $defquota; - $newisdefault = 1; + &tool_changes('reqcrsotherdom',\@requestcourses,\%oldsettings,\%oldsettingstext, + \%userenv,\%changeHash,\%changed,\%newsettings,\%newsettingstext); + } + } + foreach my $item (@userinfo) { + if ($env{'form.c'.$item} ne $userenv{$item}) { + $namechanged{$item} = 1; } } - if ($oldisdefault) { - $olddefquotatext = &get_defaultquota_text($settingstatus); - } - if ($newisdefault) { - $newdefquotatext = &get_defaultquota_text($settingstatus); - } - &tool_changes('tools',\@usertools,\%oldaccess,\%oldaccesstext,\%userenv, - \%changeHash,\%changed,\%newaccess,\%newaccesstext); - if ($env{'form.ccdomain'} eq $env{'request.role.domain'}) { - &tool_changes('requestcourses',\@requestcourses,\%oldaccess,\%oldaccesstext, - \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext); - } else { - &tool_changes('reqcrsotherdom',\@requestcourses,\%oldaccess,\%oldaccesstext, - \%userenv,\%changeHash,\%changed,\%newaccess,\%newaccesstext); - } - if ($env{'form.cfirstname'} ne $userenv{'firstname'} || - $env{'form.cmiddlename'} ne $userenv{'middlename'} || - $env{'form.clastname'} ne $userenv{'lastname'} || - $env{'form.cgeneration'} ne $userenv{'generation'} || - $env{'form.cid'} ne $userenv{'id'} || - $env{'form.cpermanentemail'} ne $userenv{'permanentemail'} ) { - $namechanged = 1; - } - if (($namechanged) || (keys(%changed) > 0)) { - $changeHash{'firstname'} = $env{'form.cfirstname'}; - $changeHash{'middlename'} = $env{'form.cmiddlename'}; - $changeHash{'lastname'} = $env{'form.clastname'}; - $changeHash{'generation'} = $env{'form.cgeneration'}; - $changeHash{'id'} = $env{'form.cid'}; - $changeHash{'permanentemail'} = $env{'form.cpermanentemail'}; + foreach my $name ('portfolio','author') { + $oldsettings{'quota'}{$name} = $oldquota{$name}.' Mb'; + $newsettings{'quota'}{$name} = $newquota{$name}.' Mb'; + } + if ((keys(%namechanged) > 0) || (keys(%changed) > 0)) { my ($chgresult,$namechgresult); if (keys(%changed) > 0) { $chgresult = @@ -2724,14 +2963,22 @@ sub update_user_data { || ($key eq 'community')) { $newenvhash{'environment.requestcourses.'.$key} = $changeHash{'requestcourses.'.$key}; - if ($changeHash{'requestcourses.'.$key} ne '') { - $newenvhash{'environment.canrequest.'.$key} = - $changeHash{'requestcourses.'.$key}; + if ($changeHash{'requestcourses.'.$key}) { + $newenvhash{'environment.canrequest.'.$key} = 1; } else { $newenvhash{'environment.canrequest.'.$key} = &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'}, $key,'reload','requestcourses'); } + } elsif ($key eq 'requestauthor') { + $newenvhash{'environment.'.$key} = $changeHash{$key}; + if ($changeHash{$key}) { + $newenvhash{'environment.canrequest.author'} = 1; + } else { + $newenvhash{'environment.canrequest.author'} = + &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'}, + $key,'reload','requestauthor'); + } } elsif ($key ne 'quota') { $newenvhash{'environment.tools.'.$key} = $changeHash{'tools.'.$key}; @@ -2741,7 +2988,7 @@ sub update_user_data { } else { $newenvhash{'environment.availabletools.'.$key} = &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'}, - $key,'reload','tools'); + $key,'reload','tools'); } } } @@ -2751,14 +2998,17 @@ sub update_user_data { } } } - if ($namechanged) { - # Make the change + if (keys(%namechanged) > 0) { + foreach my $field (@userinfo) { + $changeHash{$field} = $env{'form.c'.$field}; + } +# Make the change $namechgresult = &Apache::lonnet::modifyuser($env{'form.ccdomain'}, $env{'form.ccuname'},$changeHash{'id'},undef,undef, $changeHash{'firstname'},$changeHash{'middlename'}, $changeHash{'lastname'},$changeHash{'generation'}, - $changeHash{'id'},undef,$changeHash{'permanentemail'}); + $changeHash{'id'},undef,$changeHash{'permanentemail'},undef,\@userinfo); %userupdate = ( lastname => $env{'form.clastname'}, middlename => $env{'form.cmiddlename'}, @@ -2767,139 +3017,13 @@ sub update_user_data { id => $env{'form.cid'}, ); } - if (($namechanged && $namechgresult eq 'ok') || + if (((keys(%namechanged) > 0) && $namechgresult eq 'ok') || ((keys(%changed) > 0) && $chgresult eq 'ok')) { # Tell the user we changed the name - my %lt=&Apache::lonlocal::texthash( - 'uic' => 'User Information Changed', - 'frst' => 'First Name', - 'mddl' => 'Middle Name', - 'lst' => 'Last Name', - 'gen' => 'Generation', - 'id' => 'Student/Employee ID', - 'mail' => 'Permanent e-mail address', - 'disk' => 'Disk space allocated to portfolio files', - 'blog' => 'Blog Availability', - 'aboutme' => 'Personal Information Page Availability', - 'portfolio' => 'Portfolio Availability', - 'official' => 'Can Request Official Courses', - 'unofficial' => 'Can Request Unofficial Courses', - 'community' => 'Can Request Communities', - 'inststatus' => "Affiliation", - 'prvs' => 'Previous Value:', - 'chto' => 'Changed To:' - ); - $r->print('

'.$lt{'uic'}.'

'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row()); - $r->print(<<"END"); - - - - - - - -END - if ($showinststatus) { - $r->print(" - \n"); - } - if ($showrequestcourses) { - foreach my $item (@requestcourses) { - $r->print(" - \n"); - } - } elsif ($showreqotherdom) { - foreach my $item (@requestcourses) { - $r->print(" - \n"); - } - } - if ($showquota) { - $r->print(" - \n"); - } - if ($showtools) { - foreach my $item (@usertools) { - $r->print(" - \n"); - } - } - $r->print(&Apache::loncommon::end_data_table_header_row(). - &Apache::loncommon::start_data_table_row()); - $r->print(<<"END"); - - - - - - - -END - if ($showinststatus) { - $r->print(" - \n"); - } - if ($showrequestcourses) { - foreach my $item (@requestcourses) { - $r->print(" - \n"); - } - } elsif ($showreqotherdom) { - foreach my $item (@requestcourses) { - $r->print(" - \n"); - } - } - if ($showquota) { - $r->print(" - \n"); - } - if ($showtools) { - foreach my $item (@usertools) { - $r->print(" - \n"); - } - } - $r->print(&Apache::loncommon::end_data_table_row(). - &Apache::loncommon::start_data_table_row()); - $r->print(<<"END"); - - - - - - - -END - if ($showinststatus) { - $r->print(" - \n"); - } - if ($showrequestcourses) { - foreach my $item (@requestcourses) { - $r->print(" - \n"); - } - } elsif ($showreqotherdom) { - foreach my $item (@requestcourses) { - $r->print(" - \n"); - } - } - if ($showquota) { - $r->print(" - \n"); - } - if ($showtools) { - foreach my $item (@usertools) { - $r->print(" - \n"); - } - } - $r->print(&Apache::loncommon::end_data_table_row(). - &Apache::loncommon::end_data_table().'
'); + &display_userinfo($r,1,\@disporder,\%canshow,\@requestcourses, + \@usertools,\@requestauthor,\%userenv,\%changed,\%namechanged, + \%oldsettings, \%oldsettingstext,\%newsettings, + \%newsettingstext); if ($env{'form.cid'} ne $userenv{'id'}) { &Apache::lonnet::idput($env{'form.ccdomain'}, ($env{'form.ccuname'} => $env{'form.cid'})); @@ -2925,54 +3049,13 @@ END $env{'form.ccuname'}.' '.&mt('in domain').' '. $env{'form.ccdomain'}.'
'); } - } else { # End of if ($env ... ) logic + } else { # End of if ($env ... ) logic # They did not want to change the users name, quota, tool availability, # or ability to request creation of courses, # but we can still tell them what the name and quota and availabilities are - my %lt=&Apache::lonlocal::texthash( - 'id' => "Student/Employee ID", - 'mail' => "Permanent e-mail address", - 'disk' => "Disk space allocated to user's portfolio files", - 'blog' => "Blog Availability", - 'aboutme' => "Personal Information Page Availability", - 'portfolio' => "Portfolio Availability", - 'official' => "Can Request Official Courses", - 'unofficial' => "Can Request Unofficial Courses", - 'community' => "Can Request Communities", - 'inststatus' => "Affiliation", - ); - $r->print(<<"END"); -

$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'} -END - if ($userenv{'permanentemail'} ne '') { - $r->print('
['.$lt{'mail'}.': '. - $userenv{'permanentemail'}.']'); - } - if ($showinststatus) { - $r->print('
['.$lt{'inststatus'}.': '.$oldinststatuses.']'); - } - if ($showrequestcourses) { - foreach my $item (@requestcourses) { - $r->print('
['.$lt{$item}.': '.$newaccess{$item}.' '. - $newaccesstext{$item}.']'."\n"); - } - } elsif ($showreqotherdom) { - foreach my $item (@requestcourses) { - $r->print('
['.$lt{$item}.': '.$newaccess{$item}.' '. - $newaccesstext{$item}.']'."\n"); - } - } - if ($showtools) { - foreach my $item (@usertools) { - $r->print('
['.$lt{$item}.': '.$newaccess{$item}.' '. - $newaccesstext{$item}.']'."\n"); - } - } - if ($showquota) { - $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. - $olddefquotatext.']'); - } - $r->print('

'); + &display_userinfo($r,undef,\@disporder,\%canshow,\@requestcourses, + \@usertools,\@requestauthor,\%userenv,\%changed,\%namechanged,\%oldsettings, + \%oldsettingstext,\%newsettings,\%newsettingstext); } if (@mod_disallowed) { my ($rolestr,$contextname); @@ -3008,8 +3091,10 @@ END .&Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts,\%curr_rules) .''); } + &Apache::lonhtmlcommon::Close_PrgWin($r,\%prog_state); if ($env{'form.action'} eq 'singlestudent') { - &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype); + &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context, + $crstype,$showcredits,$defaultcredits); $r->print('

'); if ($crstype eq 'Community') { $r->print(&mt('Enroll Another Member')); @@ -3018,8 +3103,8 @@ END } $r->print('

'); } else { - my @rolechanges = &update_roles($r,$context); - if ($namechanged) { + my @rolechanges = &update_roles($r,$context,$showcredits); + if (keys(%namechanged) > 0) { if ($context eq 'course') { if (@userroles > 0) { if ((@rolechanges == 0) || @@ -3039,12 +3124,129 @@ END if ($env{'form.popup'}) { $r->print('

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

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

' - .&mt('Modify this user: [_1]',''.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.')').'' - .(' 'x5).'' - .&mt('Create/Modify Another User').'

'); + $r->print('
'.&Apache::lonhtmlcommon::actionbox(['' + .&mt('Modify this user: [_1]',''.$env{'form.ccuname'}.':'.$env{'form.ccdomain'}.' ('.$userinfo.')').'', + ''.&mt('Create/Modify Another User').''])); + } + } +} + +sub display_userinfo { + my ($r,$changed,$order,$canshow,$requestcourses,$usertools,$requestauthor, + $userenv,$changedhash,$namechangedhash,$oldsetting,$oldsettingtext, + $newsetting,$newsettingtext) = @_; + return unless (ref($order) eq 'ARRAY' && + ref($canshow) eq 'HASH' && + ref($requestcourses) eq 'ARRAY' && + ref($requestauthor) eq 'ARRAY' && + ref($usertools) eq 'ARRAY' && + ref($userenv) eq 'HASH' && + ref($changedhash) eq 'HASH' && + ref($oldsetting) eq 'HASH' && + ref($oldsettingtext) eq 'HASH' && + ref($newsetting) eq 'HASH' && + ref($newsettingtext) eq 'HASH'); + my %lt=&Apache::lonlocal::texthash( + 'ui' => 'User Information', + 'uic' => 'User Information Changed', + 'firstname' => 'First Name', + 'middlename' => 'Middle Name', + 'lastname' => 'Last Name', + 'generation' => 'Generation', + 'id' => 'Student/Employee ID', + 'permanentemail' => 'Permanent e-mail address', + 'portfolioquota' => 'Disk space allocated to portfolio files', + 'authorquota' => 'Disk space allocated to authoring space', + 'blog' => 'Blog Availability', + 'webdav' => 'WebDAV Availability', + 'aboutme' => 'Personal Information Page Availability', + 'portfolio' => 'Portfolio Availability', + 'official' => 'Can Request Official Courses', + 'unofficial' => 'Can Request Unofficial Courses', + 'community' => 'Can Request Communities', + 'requestauthor' => 'Can Request Author Role', + 'inststatus' => "Affiliation", + 'prvs' => 'Previous Value:', + 'chto' => 'Changed To:' + ); + if ($changed) { + $r->print('

'.$lt{'uic'}.'

'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row()); + $r->print("\n"); + $r->print(''); + $r->print(''); + $r->print(&Apache::loncommon::end_data_table_header_row()); + my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id'); + + + foreach my $item (@userinfo) { + my $value = $env{'form.c'.$item}; + #show changes only: + unless($value eq $userenv->{$item}){ + $r->print(&Apache::loncommon::start_data_table_row()); + + $r->print("\n"); + $r->print(''); + $r->print("\n"); + + $r->print(&Apache::loncommon::end_data_table_row()); + } + } + foreach my $entry (@{$order}) { + if ($canshow->{$entry} && ($newsetting->{$entry} ne $newsetting->{$entry})) { + $r->print(&Apache::loncommon::start_data_table_row()); + if (($entry eq 'requestcourses') || ($entry eq 'reqcrsotherdom')) { + foreach my $item (@{$requestcourses}) { + $r->print("\n"); + $r->print("\n"); + my $value = $newsetting->{$item}.' '.$newsettingtext->{$item}; + if ($changedhash->{$item}) { + $value = ''.$value.''; + } + $r->print("\n"); + } + } elsif ($entry eq 'tools') { + foreach my $item (@{$usertools}) { + $r->print("\n"); + $r->print("\n"); + my $value = $newsetting->{$item}.' '.$newsettingtext->{$item}; + if ($changedhash->{$item}) { + $value = ''.$value.''; + } + $r->print("\n"); + } + } elsif ($entry eq 'quota') { + if ((ref($oldsetting->{$entry}) eq 'HASH') && (ref($oldsettingtext->{$entry}) eq 'HASH') && + (ref($newsetting->{$entry}) eq 'HASH') && (ref($newsettingtext->{$entry}) eq 'HASH')) { + foreach my $name ('portfolio','author') { + $r->print("\n"); + $r->print("\n"); + my $value = $newsetting->{$entry}->{$name}.' '.$newsettingtext->{$entry}->{$name}; + if ($changedhash->{$entry}) { + $value = ''.$value.''; + } + $r->print("\n"); + } + } + } else { + $r->print("\n"); + $r->print("\n"); + my $value = $newsetting->{$entry}.' '.$newsettingtext->{$entry}; + if ($changedhash->{$entry}) { + $value = ''.$value.''; + } + $r->print("\n"); + } + $r->print(&Apache::loncommon::end_data_table_row()); + } } + $r->print(&Apache::loncommon::end_data_table().'
'); + } else { + $r->print('

'.$lt{'ui'}.'

'. + '

'.&mt('No changes made to user information').'

'); } + return; } sub tool_changes { @@ -3142,25 +3344,29 @@ sub tool_changes { return; } foreach my $tool (@{$usertools}) { - my $newval; + my ($newval,$envkey); + $envkey = $context.'.'.$tool; if ($context eq 'requestcourses') { $newval = $env{'form.crsreq_'.$tool}; if ($newval eq 'autolimit') { $newval .= '='.$env{'form.crsreq_'.$tool.'_limit'}; } + } elsif ($context eq 'requestauthor') { + $newval = $env{'form.'.$context}; + $envkey = $context; } else { $newval = $env{'form.'.$context.'_'.$tool}; } - if ($userenv->{$context.'.'.$tool} ne '') { + if ($userenv->{$envkey} ne '') { $oldaccess->{$tool} = &mt('custom'); - if ($userenv->{$context.'.'.$tool}) { + if ($userenv->{$envkey}) { $oldaccesstext->{$tool} = &mt("availability set to 'on'"); } else { $oldaccesstext->{$tool} = &mt("availability set to 'off'"); } - $changeHash->{$context.'.'.$tool} = $userenv->{$context.'.'.$tool}; + $changeHash->{$envkey} = $userenv->{$envkey}; if ($env{'form.custom'.$tool} == 1) { - if ($newval ne $userenv->{$context.'.'.$tool}) { + if ($newval ne $userenv->{$envkey}) { $changed->{$tool} = &tool_admin($tool,$newval,$changeHash, $context); if ($changed->{$tool}) { @@ -3219,7 +3425,7 @@ sub tool_changes { } sub update_roles { - my ($r,$context) = @_; + my ($r,$context,$showcredits) = @_; my $now=time; my @rolechanges; my %disallowed; @@ -3236,14 +3442,20 @@ sub update_roles { &Apache::lonnet::revokerole($env{'form.ccdomain'}, $env{'form.ccuname'}, $scope,$role,'','',$context); - $r->print(&mt('Revoking [_1] in [_2]: [_3]', - $role,$scope,''.$result.'').'
'); + $r->print(&Apache::lonhtmlcommon::confirm_success( + &mt('Revoking [_1] in [_2]', + &Apache::lonnet::plaintext($role), + &Apache::loncommon::show_role_extent($scope,$context,$role)), + $result ne "ok").'
'); + if ($result ne "ok") { + $r->print(&mt('Error: [_1]',$result).'
'); + } if ($role eq 'st') { my $result = &Apache::lonuserutils::classlist_drop($scope, $env{'form.ccuname'},$env{'form.ccdomain'}, $now); - $r->print($result); + $r->print(&Apache::lonhtmlcommon::confirm_success($result)); } if (!grep(/^\Q$role\E$/,@rolechanges)) { push(@rolechanges,$role); @@ -3251,11 +3463,15 @@ sub update_roles { } if ($key=~m{^form\.rev\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}s) { # Revoke custom role - $r->print(&mt('Revoking custom role:'). - ' '.$4.' by '.$3.':'.$2.' in '.$1.': '. - &Apache::lonnet::revokecustomrole($env{'form.ccdomain'}, - $env{'form.ccuname'},$1,$2,$3,$4,'','',$context). - '
'); + my $result = &Apache::lonnet::revokecustomrole( + $env{'form.ccdomain'},$env{'form.ccuname'},$1,$2,$3,$4,'','',$context); + $r->print(&Apache::lonhtmlcommon::confirm_success( + &mt('Revoking custom role [_1] by [_2] in [_3]', + $4,$3.':'.$2,&Apache::loncommon::show_role_extent($1,$context,'cr')), + $result ne 'ok').'
'); + if ($result ne "ok") { + $r->print(&mt('Error: [_1]',$result).'
'); + } if (!grep(/^cr$/,@rolechanges)) { push(@rolechanges,'cr'); } @@ -3269,14 +3485,21 @@ sub update_roles { $env{'form.ccuname'}, $scope,$role,$now,0,1,'', $context); - $r->print(&mt('Deleting [_1] in [_2]: [_3]',$role,$scope, - ''.$result.'').'
'); + $r->print(&Apache::lonhtmlcommon::confirm_success( + &mt('Deleting [_1] in [_2]', + &Apache::lonnet::plaintext($role), + &Apache::loncommon::show_role_extent($scope,$context,$role)), + $result ne 'ok').'
'); + if ($result ne "ok") { + $r->print(&mt('Error: [_1]',$result).'
'); + } + if ($role eq 'st') { my $result = &Apache::lonuserutils::classlist_drop($scope, $env{'form.ccuname'},$env{'form.ccdomain'}, $now); - $r->print($result); + $r->print(&Apache::lonhtmlcommon::confirm_success($result)); } if (!grep(/^\Q$role\E$/,@rolechanges)) { push(@rolechanges,$role); @@ -3285,11 +3508,17 @@ sub update_roles { if ($key=~m{^form\.del\:([^_]+)_cr\.cr/($match_domain)/($match_username)/(\w+)$}) { my ($url,$rdom,$rnam,$rolename) = ($1,$2,$3,$4); # Delete custom role - $r->print(&mt('Deleting custom role [_1] by [_2] in [_3]', - $rolename,$rnam.':'.$rdom,$url).': '. - &Apache::lonnet::assigncustomrole($env{'form.ccdomain'}, - $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now, - 0,1,$context).'
'); + my $result = + &Apache::lonnet::assigncustomrole($env{'form.ccdomain'}, + $env{'form.ccuname'},$url,$rdom,$rnam,$rolename,$now, + 0,1,$context); + $r->print(&Apache::lonhtmlcommon::confirm_success(&mt('Deleting custom role [_1] by [_2] in [_3]', + $rolename,$rnam.':'.$rdom,&Apache::loncommon::show_role_extent($1,$context,'cr')), + $result ne "ok").'
'); + if ($result ne "ok") { + $r->print(&mt('Error: [_1]',$result).'
'); + } + if (!grep(/^cr$/,@rolechanges)) { push(@rolechanges,'cr'); } @@ -3305,27 +3534,38 @@ sub update_roles { my $output; if ($role eq 'st') { if ($url =~ m-^/($match_domain)/($match_courseid)/?(\w*)$-) { - my $result = &Apache::loncommon::commit_studentrole(\$logmsg,$udom,$uname,$url,$role,$now,0,$1,$2,$3); + my ($cdom,$cnum,$csec) = ($1,$2,$3); + my $credits; + if ($showcredits) { + my $defaultcredits = + &Apache::lonuserutils::get_defaultcredits($cdom,$cnum); + $credits = &get_user_credits($defaultcredits,$cdom,$cnum); + } + 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) { $output = $logmsg; } else { - $output = "Error: $result\n"; + $output = &mt('Error: [_1]',$result)."\n"; } } else { - $output = &mt('Assigning').' '.$role.' in '.$url. - &mt('starting').' '.localtime($now). - ':
'.$logmsg.'
'. - &mt('Add to classlist').': ok
'; + $output = &Apache::lonhtmlcommon::confirm_success(&mt('Assigning [_1] in [_2] starting [_3]', + &Apache::lonnet::plaintext($role), + &Apache::loncommon::show_role_extent($url,$context,'st'), + &Apache::lonlocal::locallocaltime($now))).'
'.$logmsg.'
'; } } } else { my $result=&Apache::lonnet::assignrole($env{'form.ccdomain'}, $env{'form.ccuname'},$url,$role,0,$now,'','', $context); - $output = &mt('Re-enabling [_1] in [_2]: [_3]', - $role,$url,''.$result.'').'
'; - } + $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).'
'; + } + } $r->print($output); if (!grep(/^\Q$role\E$/,@rolechanges)) { push(@rolechanges,$role); @@ -3337,8 +3577,13 @@ sub update_roles { my $result = &Apache::lonnet::assigncustomrole( $env{'form.ccdomain'}, $env{'form.ccuname'}, $url,$rdom,$rnam,$rolename,0,$now,undef,$context); - $r->print(&mt('Re-enabling custom role [_1] by [_2] in [_3]: [_4]', - $rolename,$rnam.':'.$rdom,$url,''.$result.'').'
'); + $r->print(&Apache::lonhtmlcommon::confirm_success( + &mt('Re-enabling custom role [_1] by [_2] in [_3]', + $rolename,$rnam.':'.$rdom,&Apache::loncommon::show_role_extent($1,$context,'cr')), + $result ne "ok").'
'); + if ($result ne "ok") { + $r->print(&mt('Error: [_1]',$result).'
'); + } if (!grep(/^cr$/,@rolechanges)) { push(@rolechanges,'cr'); } @@ -3395,8 +3640,20 @@ sub update_roles { # split multiple sections my %sections = (); my $num_sections = &build_roles($env{'form.sec_'.$one.'_'.$two.'_'.$three},\%sections,$three); + my $credits; + if ($three eq 'st') { + if ($showcredits) { + my $defaultcredits = + &Apache::lonuserutils::get_defaultcredits($one,$two); + $credits = $env{'form.credits_'.$one.'_'.$two.'_'.$three}; + $credits =~ s/[^\d\.]//g; + if ($credits eq $defaultcredits) { + undef($credits); + } + } + } if ($num_sections == 0) { - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context)); + $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); @@ -3410,13 +3667,13 @@ sub update_roles { next; } my $securl = $url.'/'.$sec; - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec,$context)); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$securl,$three,$start,$end,$one,$two,$sec,$context,$credits)); } else { $emptysec = 1; } } if ($emptysec) { - $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context)); + $r->print(&Apache::loncommon::commit_standardrole($udom,$uname,$url,$three,$start,$end,$one,$two,'',$context,$credits)); } } if (!grep(/^\Q$three\E$/,@rolechanges)) { @@ -3476,15 +3733,38 @@ sub update_roles { } } # End of foreach (keys(%env)) # Flush the course logs so reverse user roles immediately updated - &Apache::lonnet::flushcourselogs(); + $r->register_cleanup(\&Apache::lonnet::flushcourselogs); if (@rolechanges == 0) { - $r->print(&mt('No roles to modify')); + $r->print('

'.&mt('No roles to modify').'

'); } return @rolechanges; } +sub get_user_credits { + my ($uname,$udom,$defaultcredits,$cdom,$cnum) = @_; + if ($cdom eq '' || $cnum eq '') { + return unless ($env{'request.course.id'}); + $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + } + my $credits; + my %currhash = + &Apache::lonnet::get('classlist',[$uname.':'.$udom],$cdom,$cnum); + if (keys(%currhash) > 0) { + my @items = split(/:/,$currhash{$uname.':'.$udom}); + my $crdidx = &Apache::loncoursedata::CL_CREDITS() - 3; + $credits = $items[$crdidx]; + $credits =~ s/[^\d\.]//g; + } + if ($credits eq $defaultcredits) { + undef($credits); + } + return $credits; +} + sub enroll_single_student { - my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype) = @_; + my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype, + $showcredits,$defaultcredits) = @_; $r->print('

'); if ($crstype eq 'Community') { $r->print(&mt('Enrolling Member')); @@ -3496,6 +3776,17 @@ sub enroll_single_student { # Remove non alphanumeric values from section $env{'form.sections'}=~s/\W//g; + my $credits; + if (($showcredits) && ($env{'form.credits'} ne '')) { + $credits = $env{'form.credits'}; + $credits =~ s/[^\d\.]//g; + if ($credits ne '') { + if ($credits eq $defaultcredits) { + undef($credits); + } + } + } + # 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); @@ -3505,7 +3796,8 @@ sub enroll_single_student { $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'}, $env{'form.cmiddlename'},$env{'form.clastname'}, $env{'form.generation'},$env{'form.sections'},$enddate, - $startdate,'manual',undef,$env{'request.course.id'},'',$context); + $startdate,'manual',undef,$env{'request.course.id'},'',$context, + $credits); if ($enroll_result =~ /^ok/) { $r->print(&mt('[_1] enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'})); if ($env{'form.sections'} ne '') { @@ -3558,7 +3850,7 @@ sub get_defaultquota_text { sub update_result_form { my ($uhome) = @_; my $outcome = - '
'."\n"; + ''."\n"; foreach my $item ('srchby','srchin','srchtype','srchterm','srchdomain','ccuname','ccdomain') { $outcome .= ''."\n"; } @@ -3581,13 +3873,13 @@ sub update_result_form { } sub quota_admin { - my ($setquota,$changeHash) = @_; + my ($setquota,$changeHash,$name) = @_; my $quotachanged; if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) { # Current user has quota modification privileges if (ref($changeHash) eq 'HASH') { $quotachanged = 1; - $changeHash->{'portfolioquota'} = $setquota; + $changeHash->{$name.'quota'} = $setquota; } } return $quotachanged; @@ -3604,6 +3896,10 @@ sub tool_admin { if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { $canchange = 1; } + } elsif ($context eq 'requestauthor') { + 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; @@ -3612,7 +3908,11 @@ sub tool_admin { if ($canchange) { if (ref($changeHash) eq 'HASH') { $toolchanged = 1; - $changeHash->{$context.'.'.$tool} = $settool; + if ($tool eq 'requestauthor') { + $changeHash->{$context} = $settool; + } else { + $changeHash->{$context.'.'.$tool} = $settool; + } } } return $toolchanged; @@ -3677,13 +3977,7 @@ sub custom_role_editor { &print_username_entry_form($r,undef,undef,undef,undef,$crstype,$brcrum); return; } - my $is_custom = &Apache::loncommon::needs_gci_custom(); - my $title = 'User Management'; - if ($context eq 'course') { - if ($is_custom) { - $title = 'Enrollment and Student Activity'; - } - } + # ------------------------------------------------------- What can be assigned? my %full=(); my %courselevel=(); @@ -3954,14 +4248,6 @@ sub set_custom_role { .$jsback."\n" .'// ]]>'."\n" .''."\n"; - my $bread_crumbs_component = 'User Management'; - my $is_custom = &Apache::loncommon::needs_gci_custom(); - if ($context eq 'course') { - if ($is_custom) { - $bread_crumbs_component = 'Enrollment and Student Activity'; - } - } - push(@{$brcrum}, {href => "javascript:backPage(document.customresult,'pickrole','')", text => "Pick custom role", @@ -3978,7 +4264,7 @@ sub set_custom_role { help => 'Course_Editing_Custom_Roles'}, ); my $args = { bread_crumbs => $brcrum, - bread_crumbs_component => $bread_crumbs_component }; + bread_crumbs_component => 'User Management'}; $r->print(&Apache::loncommon::start_page('Save Custom Role',$jscript,$args)); my ($rdummy,$roledef)= @@ -4055,101 +4341,80 @@ sub handler { } else { $context = 'domain'; } - my ($permission,$allowed) = - &Apache::lonuserutils::get_permission($context,$crstype); - if (!$allowed) { - $env{'user.error.msg'}= - "/adm/createuser:cst:0:0:Cannot create/modify user data ". - "or view user status."; - return HTTP_NOT_ACCEPTABLE; - } - &Apache::loncommon::content_type($r,'text/html'); - $r->send_http_header; - - my $title = 'User Management'; - my $is_custom = &Apache::loncommon::needs_gci_custom(); - if ($context eq 'course') { - if ($is_custom) { - $title = 'Enrollment and Student Activity'; - } - } &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, ['action','state','callingform','roletype','showrole','bulkaction','popup','phase', 'username','domain','srchterm','srchdomain','srchin','srchby','srchtype']); &Apache::lonhtmlcommon::clear_breadcrumbs(); my $args; my $brcrum = []; - my $bread_crumbs_component = $title; - if ($env{'form.context'} eq 'requestcrs') { - my $reqstate = 'uploadroster'; - if ($env{'form.state'} eq 'enrolling') { - $reqstate = 'enrolling'; - } - unless (&Apache::lonrequestcourse::generate_page($r,'new',$reqstate)) { - return OK; - } - } elsif ($env{'form.action'} ne 'dateselect') { + my $bread_crumbs_component = 'User Management'; + if ($env{'form.action'} ne 'dateselect') { $brcrum = [{href=>"/adm/createuser", - text=>$title, + text=>"User Management", help=>'Course_Create_Class_List,Course_Change_Privileges,Course_View_Class_List,Course_Editing_Custom_Roles,Course_Add_Student,Course_Drop_Student,Course_Automated_Enrollment,Course_Self_Enrollment,Course_Manage_Group'} ]; } #SD Following files not added to help, because the corresponding .tex-files seem to #be missing: Course_Approve_Selfenroll,Course_User_Logs, + my ($permission,$allowed) = + &Apache::lonuserutils::get_permission($context,$crstype); + if (!$allowed) { + if ($context eq 'course') { + $r->internal_redirect('/adm/viewclasslist'); + return OK; + } + $env{'user.error.msg'}= + "/adm/createuser:cst:0:0:Cannot create/modify user data ". + "or view user status."; + return HTTP_NOT_ACCEPTABLE; + } + + &Apache::loncommon::content_type($r,'text/html'); + $r->send_http_header; + + my $showcredits; + if ((($context eq 'course') && ($crstype eq 'Course')) || + ($context eq 'domain')) { + my %domdefaults = + &Apache::lonnet::get_domain_defaults($env{'request.role.domain'}); + if ($domdefaults{'officialcredits'} || $domdefaults{'unofficialcredits'}) { + $showcredits = 1; + } + } # Main switch on form.action and form.state, as appropriate if (! exists($env{'form.action'})) { $args = {bread_crumbs => $brcrum, - bread_crumbs_component => $bread_crumbs_component}; + bread_crumbs_component => $bread_crumbs_component}; $r->print(&header(undef,$args)); $r->print(&print_main_menu($permission,$context,$crstype)); } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) { - unless ($env{'form.context'} eq 'requestcrs') { - push(@{$brcrum}, - { href => '/adm/createuser?action=upload&state=', - text => 'Upload Users List', - help => 'Course_Create_Class_List', - }); - $bread_crumbs_component = 'Upload Users List'; - $args = {bread_crumbs => $brcrum, - bread_crumbs_component => $bread_crumbs_component}; - $r->print(&header(undef,$args)); - } - unless (($env{'form.context'} eq 'requestcrs') && ($env{'form.state'} eq 'enrolling')) { - $r->print(''."\n"); - } + push(@{$brcrum}, + { href => '/adm/createuser?action=upload&state=', + text => 'Upload Users List', + help => 'Course_Create_Class_List', + }); + $bread_crumbs_component = 'Upload Users List'; + $args = {bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); + $r->print(''."\n"); if (! exists($env{'form.state'})) { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } elsif ($env{'form.state'} eq 'got_file') { - my $formname; - if ($env{'form.context'} eq 'requestcrs') { - $formname = 'studentform'; - } - &Apache::lonuserutils::print_upload_manager_form($r,$context, - $permission,$crstype,$formname); - if ($env{'form.context'} eq 'requestcrs') { - $r->print(''); - } + &Apache::lonuserutils::print_upload_manager_form($r,$context,$permission, + $crstype,$showcredits); } elsif ($env{'form.state'} eq 'enrolling') { if ($env{'form.datatoken'}) { - &Apache::lonuserutils::upfile_drop_add($r,$context,$permission); - if ($env{'form.context'} eq 'requestcrs') { - $r->print('

'. - ''. - ''. - ''. - ''. - ''. - &Apache::lonrequestcourse::done_display()); - } + &Apache::lonuserutils::upfile_drop_add($r,$context,$permission, + $showcredits); } } 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'})) { my $phase = $env{'form.phase'}; @@ -4164,15 +4429,21 @@ sub handler { if ($env{'form.phase'} eq 'createnewuser') { my $response; if ($env{'form.srchterm'} !~ /^$match_username$/) { - my $response = '

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

'; + my $response = + '' + .&mt('You must specify a valid username. Only the following are allowed:' + .' letters numbers - . @') + .''; $env{'form.phase'} = ''; - &print_username_entry_form($r,$context,$response,$srch,undef,$crstype,$brcrum); + &print_username_entry_form($r,$context,$response,$srch,undef, + $crstype,$brcrum,$showcredits); } else { my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'}); my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'}); &print_user_modification_page($r,$ccuname,$ccdomain, $srch,$response,$context, - $permission,$crstype); + $permission,$crstype,$brcrum, + $showcredits); } } elsif ($env{'form.phase'} eq 'get_user_info') { my ($currstate,$response,$forcenewuser,$results) = @@ -4182,7 +4453,8 @@ sub handler { } if ($currstate eq 'select') { &print_user_selection_page($r,$response,$srch,$results, - \@search,$context,undef,$crstype); + \@search,$context,undef,$crstype, + $brcrum); } elsif ($currstate eq 'modify') { my ($ccuname,$ccdomain); if (($srch->{'srchby'} eq 'uname') && @@ -4212,12 +4484,14 @@ sub handler { my $ccuname = &LONCAPA::clean_username($env{'form.seluname'}); my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'}); &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'', - $context,$permission,$crstype,$brcrum); + $context,$permission,$crstype, + $brcrum); } } elsif ($env{'form.phase'} eq 'update_user_data') { - &update_user_data($r,$context,$crstype,$brcrum); + &update_user_data($r,$context,$crstype,$brcrum,$showcredits); } else { - &print_username_entry_form($r,$context,undef,$srch,undef,$crstype,$brcrum); + &print_username_entry_form($r,$context,undef,$srch,undef,$crstype, + $brcrum); } } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) { if ($env{'form.phase'} eq 'set_custom_roles') { @@ -4225,6 +4499,32 @@ sub handler { } else { &custom_role_editor($r,$brcrum); } + } elsif (($env{'form.action'} eq 'processauthorreq') && + ($permission->{'cusr'}) && + (&Apache::lonnet::allowed('cau',$env{'request.role.domain'}))) { + push(@{$brcrum}, + {href => '/adm/createuser?action=processauthorreq', + text => 'Authoring space requests', + help => 'Domain_Role_Approvals'}); + $bread_crumbs_component = 'Authoring requests'; + if ($env{'form.state'} eq 'done') { + push(@{$brcrum}, + {href => '/adm/createuser?action=authorreqqueue', + text => 'Result', + help => 'Domain_Role_Approvals'}); + $bread_crumbs_component = 'Authoring request result'; + } + $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); + if (!exists($env{'form.state'})) { + $r->print(&Apache::loncoursequeueadmin::display_queued_requests('requestauthor', + $env{'request.role.domain'})); + } elsif ($env{'form.state'} eq 'done') { + $r->print('

'.&mt('Authoring request processing').'

'."\n"); + $r->print(&Apache::loncoursequeueadmin::update_request_queue('requestauthor', + $env{'request.role.domain'})); + } } elsif (($env{'form.action'} eq 'listusers') && ($permission->{'view'} || $permission->{'cusr'})) { if ($env{'form.phase'} eq 'bulkchange') { @@ -4240,11 +4540,8 @@ sub handler { $r->print(&header(undef,$args)); my $setting = $env{'form.roletype'}; my $choice = $env{'form.bulkaction'}; - $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users", - 'Course_View_Class_List')); if ($permission->{'cusr'}) { - &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice); - $r->print(&Apache::loncommon::end_page()); + &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice,$crstype); } else { $r->print(&mt('You are not authorized to make bulk changes to user roles')); $r->print('

'.&mt('Display User Lists').''); @@ -4259,6 +4556,7 @@ sub handler { bread_crumbs_component => $bread_crumbs_component}; my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles); my $formname = 'studentform'; + my $hidecall = "hide_searching();"; if (($context eq 'domain') && (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community'))) { if ($env{'form.roletype'} eq 'course') { @@ -4275,19 +4573,26 @@ sub handler { ); $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements); } - $jscript .= &verify_user_display(); + $jscript .= &verify_user_display($context)."\n". + &Apache::loncommon::check_uncheck_jscript(); my $js = &add_script($jscript).$cb_jscript; - my $loadcode = + my $loadcode = &Apache::lonuserutils::course_selector_loadcode($formname); if ($loadcode ne '') { - $args->{add_entries} = {onload => $loadcode}; + $args->{add_entries} = {onload => "$loadcode;$hidecall"}; + } else { + $args->{add_entries} = {onload => $hidecall}; } $r->print(&header($js,$args)); } else { - $r->print(&header(&add_script(&verify_user_display()),$args)); + $args->{add_entries} = {onload => $hidecall}; + $jscript = &verify_user_display($context). + &Apache::loncommon::check_uncheck_jscript(); + $r->print(&header(&add_script($jscript),$args)); } &Apache::lonuserutils::print_userlist($r,undef,$permission,$context, - $formname,$totcodes,$codetitles,$idlist,$idlist_titles); + $formname,$totcodes,$codetitles,$idlist,$idlist_titles, + $showcredits); } } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) { my $brtext; @@ -4307,7 +4612,7 @@ sub handler { } $bread_crumbs_component = $brtext; $args = {bread_crumbs => $brcrum, - bread_crumbs_component => $bread_crumbs_component}; + bread_crumbs_component => $bread_crumbs_component}; $r->print(&header(undef,$args)); if (!exists($env{'form.state'})) { &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype); @@ -4317,12 +4622,12 @@ sub handler { } } elsif ($env{'form.action'} eq 'dateselect') { if ($permission->{'cusr'}) { - $r->print(&header(undef,undef,{'no_nav_bar' => 1}). - &Apache::lonuserutils::date_section_selector($context, - $permission,$crstype)); + $r->print(&header(undef,{'no_nav_bar' => 1}). + &Apache::lonuserutils::date_section_selector($context,$permission, + $crstype,$showcredits)); } else { - $r->print(&header(). - ''.&mt('You do not have permission to modify dates or sections for users').''); + $r->print(&header(undef,{'no_nav_bar' => 1}). + ''.&mt('You do not have permission to modify dates or sections for users').''); } } elsif ($env{'form.action'} eq 'selfenroll') { push(@{$brcrum}, @@ -4375,16 +4680,21 @@ sub handler { $cdom,$cnum,$coursedesc)); } } elsif ($env{'form.action'} eq 'changelogs') { + my $helpitem; + if ($context eq 'course') { + $helpitem = 'Course_User_Logs'; + } push (@{$brcrum}, {href => '/adm/createuser?action=changelogs', text => 'User Management Logs', - help => 'Course_User_Logs'}); + help => $helpitem}); $bread_crumbs_component = 'User Changes'; $args = { bread_crumbs => $brcrum, bread_crumbs_component => $bread_crumbs_component}; $r->print(&header(undef,$args)); &print_userchangelogs_display($r,$context,$permission); } else { + $bread_crumbs_component = 'User Management'; $args = { bread_crumbs => $brcrum, bread_crumbs_component => $bread_crumbs_component}; $r->print(&header(undef,$args)); @@ -4396,18 +4706,11 @@ sub handler { sub header { my ($jscript,$args) = @_; - my $title = 'User Management'; - my $is_custom = &Apache::loncommon::needs_gci_custom(); - if ($env{'request.course.id'}) { - if ($is_custom) { - $title = 'Enrollment and Student Activity'; - } - } my $start_page; if (ref($args) eq 'HASH') { - $start_page=&Apache::loncommon::start_page($title,$jscript,$args); + $start_page=&Apache::loncommon::start_page('User Management',$jscript,$args); } else { - $start_page=&Apache::loncommon::start_page($title,$jscript); + $start_page=&Apache::loncommon::start_page('User Management',$jscript); } return $start_page; } @@ -4422,14 +4725,122 @@ sub add_script { } sub verify_user_display { + my ($context) = @_; + my %lt = &Apache::lonlocal::texthash ( + course => 'course(s): description, section(s), status', + community => 'community(s): description, section(s), status', + author => 'author', + ); + my $photos; + if (($context eq 'course') && $env{'request.course.id'}) { + $photos = $env{'course.'.$env{'request.course.id'}.'.internal.showphoto'}; + } my $output = <<"END"; +function hide_searching() { + if (document.getElementById('searching')) { + document.getElementById('searching').style.display = 'none'; + } + return; +} + function display_update() { document.studentform.action.value = 'listusers'; document.studentform.phase.value = 'display'; document.studentform.submit(); } +function updateCols(caller) { + var context = '$context'; + var photos = '$photos'; + if (caller == 'Status') { + if ((context == 'domain') && + ((document.studentform.roletype.options[document.studentform.roletype.selectedIndex].value == 'course') || + (document.studentform.roletype.options[document.studentform.roletype.selectedIndex].value == 'community'))) { + document.getElementById('showcolstatus').checked = false; + document.getElementById('showcolstatus').disabled = 'disabled'; + document.getElementById('showcolstart').checked = false; + document.getElementById('showcolend').checked = false; + } else { + if (document.studentform.Status.options[document.studentform.Status.selectedIndex].value == 'Any') { + document.getElementById('showcolstatus').checked = true; + document.getElementById('showcolstatus').disabled = ''; + document.getElementById('showcolstart').checked = true; + document.getElementById('showcolend').checked = true; + } else { + document.getElementById('showcolstatus').checked = false; + document.getElementById('showcolstatus').disabled = 'disabled'; + document.getElementById('showcolstart').checked = false; + document.getElementById('showcolend').checked = false; + } + } + } + if (caller == 'output') { + if (photos == 1) { + if (document.getElementById('showcolphoto')) { + var photoitem = document.getElementById('showcolphoto'); + if (document.studentform.output.options[document.studentform.output.selectedIndex].value == 'html') { + photoitem.checked = true; + photoitem.disabled = ''; + } else { + photoitem.checked = false; + photoitem.disabled = 'disabled'; + } + } + } + } + if (caller == 'showrole') { + if ((document.studentform.showrole.options[document.studentform.showrole.selectedIndex].value == 'Any') || + (document.studentform.showrole.options[document.studentform.showrole.selectedIndex].value == 'cr')) { + document.getElementById('showcolrole').checked = true; + document.getElementById('showcolrole').disabled = ''; + } else { + document.getElementById('showcolrole').checked = false; + document.getElementById('showcolrole').disabled = 'disabled'; + } + if (context == 'domain') { + if ((document.studentform.roletype.options[document.studentform.roletype.selectedIndex].value == 'course') || + (document.studentform.roletype.options[document.studentform.roletype.selectedIndex].value == 'community')) { + document.getElementById('showcolstatus').checked = false; + document.getElementById('showcolstatus').disabled = 'disabled'; + document.getElementById('showcolstart').checked = false; + document.getElementById('showcolend').checked = false; + } else { + if (document.studentform.Status.options[document.studentform.Status.selectedIndex].value == 'Any') { + document.getElementById('showcolstatus').checked = true; + document.getElementById('showcolstatus').disabled = ''; + document.getElementById('showcolstart').checked = true; + document.getElementById('showcolend').checked = true; + } + } + if (document.studentform.roletype.options[document.studentform.roletype.selectedIndex].value == 'domain') { + document.getElementById('showcolextent').disabled = 'disabled'; + document.getElementById('showcolextent').checked = 'false'; + document.getElementById('showextent').style.display='none'; + document.getElementById('showcoltextextent').innerHTML = ''; + } else { + document.getElementById('showextent').style.display='block'; + document.getElementById('showextent').style.textAlign='left'; + document.getElementById('showextent').style.textFace='normal'; + if (document.studentform.roletype.options[document.studentform.roletype.selectedIndex].value == 'author') { + document.getElementById('showcolextent').disabled = ''; + document.getElementById('showcolextent').checked = 'true'; + document.getElementById('showcoltextextent').innerHTML="$lt{'author'}"; + } else { + document.getElementById('showcolextent').disabled = ''; + document.getElementById('showcolextent').checked = 'true'; + if (document.studentform.roletype.options[document.studentform.roletype.selectedIndex].value == 'community') { + document.getElementById('showcoltextextent').innerHTML="$lt{'community'}"; + } else { + document.getElementById('showcoltextextent').innerHTML="$lt{'course'}"; + } + } + } + } + } + return; +} + END return $output; @@ -4440,10 +4851,6 @@ END # Menu Phase One sub print_main_menu { my ($permission,$context,$crstype) = @_; - my $is_custom = &Apache::loncommon::needs_gci_custom(); - if (($context eq 'course') && ($is_custom)) { - return &print_gci_main_menu($permission,$context,$crstype) - } my $linkcontext = $context; my $stuterm = lc(&Apache::lonnet::plaintext('st',$crstype)); if (($context eq 'course') && ($crstype eq 'Community')) { @@ -4464,12 +4871,12 @@ sub print_main_menu { course => { upload => 'Upload a File of Course Users', singleuser => 'Add/Modify a Course User', - listusers => 'Manage Course Users', + listusers => 'List and Modify Multiple Course Users', }, community => { upload => 'Upload a File of Community Users', singleuser => 'Add/Modify a Community User', - listusers => 'Manage Community Users', + listusers => 'List and Modify Multiple Community Users', }, ); my %linktitles = ( @@ -4508,7 +4915,7 @@ sub print_main_menu { [ { linktext => $links{$linkcontext}{'upload'}, - icon => 'sctr.png', + icon => 'uplusr.png', #help => 'Course_Create_Class_List', url => '/adm/createuser?action=upload', permission => $permission->{'cusr'}, @@ -4516,7 +4923,7 @@ sub print_main_menu { }, { linktext => $links{$linkcontext}{'listusers'}, - icon => 'edit-find.png', + icon => 'mngcu.png', #help => 'Course_View_Class_List', url => '/adm/createuser?action=listusers', permission => ($permission->{'view'} || $permission->{'cusr'}), @@ -4540,6 +4947,22 @@ sub print_main_menu { permission => $permission->{'custom'}, linktitle => 'Configure a custom role.', }, + { + linktext => 'Authoring Space Requests', + icon => 'selfenrl-queue.png', + #help => 'Domain_Role_Approvals', + url => '/adm/createuser?action=processauthorreq', + permission => $permission->{'cusr'}, + linktitle => 'Approve or reject author role requests', + }, + { + linktext => 'Change Log', + icon => 'document-properties.png', + #help => 'Course_User_Logs', + url => '/adm/createuser?action=changelogs', + permission => $permission->{'cusr'}, + linktitle => 'View change log.', + }, ); }elsif ($context eq 'course'){ @@ -4603,7 +5026,7 @@ sub print_main_menu { }, { linktext => $linktext{$crstype}{'groups'}, - icon => 'conf.png', + icon => 'grps.png', #help => 'Course_Manage_Group', url => '/adm/coursegroups?refpage=cusr', permission => $permission->{'grp_manage'}, @@ -4648,7 +5071,7 @@ sub print_main_menu { push(@{ $menu[2]->{items} }, { linktext => 'User Self-Enrollment', - icon => 'cstr.png', + icon => 'self_enroll.png', #help => 'Course_Self_Enrollment', url => '/adm/createuser?action=selfenroll', permission => $permission->{'cusr'}, @@ -4656,8 +5079,19 @@ sub print_main_menu { }, ); } - }; -return Apache::lonhtmlcommon::generate_menu(@menu); + } elsif ($context eq 'author') { + push(@{ $menu[2]->{items} }, #Category: Administration + { + linktext => 'Change Log', + icon => 'document-properties.png', + #help => 'Course_User_Logs', + url => '/adm/createuser?action=changelogs', + permission => $permission->{'cusr'}, + linktitle => 'View change log.', + }, + ); + } + return Apache::lonhtmlcommon::generate_menu(@menu); # { text => 'View Log-in History', # help => 'Course_User_Logins', # action => 'logins', @@ -4665,82 +5099,6 @@ return Apache::lonhtmlcommon::generate_m # }); } -sub print_gci_main_menu { - my ($permission,$context,$crstype) = @_; - my $stuterm = lc(&Apache::lonnet::plaintext('st',$crstype)); - my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); - my %links = ( - course => { - single => 'Add/Modify a Student', - drop => 'Drop Students', - upload => 'Upload a File of Course Users', - singleuser => 'Add/Modify a Course User', - listusers => 'Concept Test Roster and Student Activity', - }, - ); - my %linktitles = ( - course => { - singleuser => 'Add a user with a certain role to this course.', - listusers => 'Show and manage users in this course.', - single => 'Add a user with the role of student to this course', - drop => 'Remove a student from this course.', - upload => 'Upload a CSV or a text file containing users.', - }, - ); - my @menu = ( {categorytitle => 'Manage Users', - items => - [ - { - linktext => $links{$context}{'single'}, - #help => 'Course_Add_Student', - icon => 'list-add.png', - url => '/adm/createuser?action=singlestudent', - permission => $permission->{'cusr'}, - linktitle => $linktitles{$context}{'single'}, - - }, - { - linktext => $links{$context}{'drop'}, - icon => 'edit-undo.png', - #help => 'Course_Drop_Student', - url => '/adm/createuser?action=drop', - permission => $permission->{'cusr'}, - linktitle => $linktitles{$context}{'drop'}, - }, - { - linktext => $links{$context}{'upload'}, - icon => 'sctr.png', - #help => 'Course_Create_Class_List', - url => '/adm/createuser?action=upload', - permission => $permission->{'cusr'}, - linktitle => $linktitles{$context}{'upload'}, - }, - { - linktext => $links{$context}{'listusers'}, - icon => 'edit-find.png', - #help => 'Course_View_Class_List', - url => '/adm/createuser?action=listusers', - permission => ($permission->{'view'} || $permission->{'cusr'}), - linktitle => $linktitles{$context}{'listusers'}, - }, - ]}, - {categorytitle => 'Administration', - items => [ ]}, - ); - - push(@{ $menu[1]->{items} }, #Category: Administration - { - linktext => 'Change Log', - icon => 'document-properties.png', - #help => 'Course_User_Logs', - url => '/adm/createuser?action=changelogs', - permission => $permission->{'cusr'}, - linktitle => 'View change log.', - }, - ); - return Apache::lonhtmlcommon::generate_menu(@menu); -} - sub restore_prev_selections { my %saveable_parameters = ('srchby' => 'scalar', 'srchin' => 'scalar', @@ -5150,7 +5508,7 @@ ENDSCRIPT ''. &Apache::loncommon::plainname($ccuname,$ccudom). ''; - $count; + $count ++; } my $rem = $count%$numcols; if ($rem) { @@ -5167,7 +5525,7 @@ ENDSCRIPT my $cid = $env{'request.course.id'}; my $currlim = $env{'course.'.$cid.'.internal.selfenroll_limit'}; my $currcap = $env{'course.'.$cid.'.internal.selfenroll_cap'}; - my $nolimit = ' checked="checked" '; + $nolimit = ' checked="checked" '; if ($currlim eq 'allstudents') { $crslimit = ' checked="checked" '; $selflimit = ' '; @@ -5223,9 +5581,9 @@ sub visible_in_cat { 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.', ); - $visactions{'unhide'} = &mt('Use [_1]Set course environment[_2] to change the "Exclude from course catalog" setting.','"','"'); - $visactions{'chgcat'} = &mt('Use [_1]Set course environment[_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]Set course environment[_2] 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.','"','"'); if (ref($domconf{'coursecategories'}) eq 'HASH') { if ($domconf{'coursecategories'}{'togglecats'} eq 'crs') { $settable{'togglecats'} = 1; @@ -5423,18 +5781,35 @@ 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 $formname = 'rolelog'; + my ($username,$domain,$crstype,%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(); + 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); # set defaults my $now = time(); my $defstart = $now - (7*24*3600); #7 days ago @@ -5476,7 +5851,8 @@ 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); @@ -5489,9 +5865,13 @@ sub print_userchangelogs_display { .'

' .'' .'' - .'' - .'' - .'' + .''; + + if ($context eq 'course') { + $tableheader .= ''; + } + $tableheader .= + '' .'' .'' .&Apache::loncommon::end_data_table_header_row(); @@ -5560,7 +5940,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}; } @@ -5570,9 +5950,12 @@ sub print_userchangelogs_display { .'' .'' .'' - .'' - .'' - .'' + .''); + if ($context eq 'course') { + $r->print(''); + } + $r->print( + '' .'' .'' .&Apache::loncommon::end_data_table_row()."\n"); @@ -5640,9 +6023,11 @@ ENDSCRIPT } 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 = '
$lt{'usr'}:  $lt{'dom'}:$domform  $sellink    $lt{'frst'}$lt{'mddl'}$lt{'lst'}$lt{'gen'}$lt{'id'}$lt{'mail'}$lt{'inststatus'}$lt{$item}$lt{$item}$lt{'disk'}$lt{$item}$lt{'prvs'}$userenv{'firstname'} $userenv{'middlename'} $userenv{'lastname'} $userenv{'generation'} $userenv{'id'}$userenv{'permanentemail'} $oldinststatuses$oldaccess{$item} $oldaccesstext{$item}$oldaccess{$item} $oldaccesstext{$item}$oldportfolioquota Mb $olddefquotatext $oldaccess{$item} $oldaccesstext{$item} $lt{'chto'}$env{'form.cfirstname'} $env{'form.cmiddlename'} $env{'form.clastname'} $env{'form.cgeneration'} $env{'form.cid'} $env{'form.cpermanentemail'} $newinststatuses$newaccess{$item} $newaccesstext{$item} $newaccess{$item} $newaccesstext{$item} $newportfolioquota Mb $newdefquotatext $newaccess{$item} $newaccesstext{$item}  '.$lt{'prvs'}.''.$lt{'chto'}.'$lt{$item}'.$userenv->{$item}.' $value $lt{$item}$oldsetting->{$item} $oldsettingtext->{$item}$value $lt{$item}$oldsetting->{$item} $oldsettingtext->{$item}$value $lt{$name.$entry}$oldsetting->{$entry}->{$name} $oldsettingtext->{$entry}->{$name} $value $lt{$entry}$oldsetting->{$entry} $oldsettingtext->{$entry} $value '.&mt('When').''.&mt('Who made the change').''.&mt('Changed User').''.&mt('Role').''.&mt('Section').''.&mt('Context').''.&mt('Role').''.&mt('Section').''.&mt('Context').''.&mt('Start').''.&mt('End').''.&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).''.$sec.''.$chgcontext.''.$rolestart.''.$roleend.'
'."\n"; } else { $row .= ''."\n"; + 'name="sec_'.$protectedcourse.'_'.$role.'" />'."\n"; } } $row .= <'. ''. ''; - my $courseform=''.&Apache::loncommon::selectcourse_link - ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course/Community','crstype').''; - my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser'); + my $courseform=&Apache::loncommon::selectcourse_link + ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Select','crstype'); + 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", @@ -6359,15 +6809,20 @@ sub course_level_dc { 'sta' => "Start", 'end' => "End", 'ssd' => "Set Start Date", - 'sed' => "Set End Date" + 'sed' => "Set End Date", + '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". + ''."\n". &Apache::loncommon::end_data_table_header_row(); my $otheritems = &Apache::loncommon::start_data_table_row()."\n". - ''."\n". + ''."\n". ''. - '
'. ''.&mt('Changes/page:').'
'. @@ -5657,7 +6042,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:').'
'. ''. @@ -5671,7 +6056,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') { @@ -5689,13 +6074,23 @@ sub role_display_filter { ''. ' -'. +''."\n". +''."\n". +''."\n". +''. &Apache::loncommon::end_data_table_header_row(). $table. &Apache::loncommon::end_data_table(); @@ -6295,12 +6732,21 @@ $table. } sub course_level_row { - my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,$lt) = @_; + my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count, + $lt,$defaultcredits,$crstype) = @_; + my $creditem; my $row = &Apache::loncommon::start_data_table_row(). ' '."\n". ' '."\n". ' '."\n"; + if (($role eq 'st') && ($crstype eq 'Course')) { + $row .= + ''; + } else { + $row .= ''; + } if (($role eq 'cc') || ($role eq 'co')) { $row .= ''; } elsif ($env{'request.course.sec'} ne '') { @@ -6326,7 +6772,7 @@ sub course_level_row { '
'.&mt('After:'). ''.$startform.'
  '. &mt('Context:').'
' - .'


'; + .'

'; + + # Server version info + my $needsrev = '2.11.0'; + if ($context eq 'course') { + $needsrev = '2.7.0'; + } + + $output .= '

' + .&mt('Only changes made from servers running LON-CAPA [_1] or later are displayed.' + ,$needsrev); + if ($version) { + $output .= ' '.&mt('This LON-CAPA server is version [_1]',$version); + } + $output .= '


'; return $output; } sub rolechg_contexts { - my ($crstype) = @_; - my %lt = &Apache::lonlocal::texthash ( + my ($context,$crstype) = @_; + my %lt; + if ($context eq 'course') { + %lt = &Apache::lonlocal::texthash ( any => 'Any', - auto => 'Automated enrollment', + automated => 'Automated Enrollment', updatenow => 'Roster Update', createcourse => 'Course Creation', course => 'User Management in course', @@ -5721,11 +6132,26 @@ sub rolechg_contexts { selfenroll => 'Self-enrolled', requestcourses => 'Course Request', ); - if ($crstype eq 'Community') { - $lt{'createcourse'} = &mt('Community Creation'); - $lt{'course'} = &mt('User Management in community'); - $lt{'requestcourses'} = &mt('Community Request'); - } + if ($crstype eq 'Community') { + $lt{'createcourse'} = &mt('Community Creation'); + $lt{'course'} = &mt('User Management in community'); + $lt{'requestcourses'} = &mt('Community Request'); + } + } elsif ($context eq 'domain') { + %lt = &Apache::lonlocal::texthash ( + any => 'Any', + domain => 'User Management in domain', + requestauthor => 'Authoring Request', + server => 'Command line script (DC role)', + domconfig => 'Self-enrolled', + ); + } else { + %lt = &Apache::lonlocal::texthash ( + any => 'Any', + domain => 'User Management in domain', + author => 'User Management by author', + ); + } return %lt; } @@ -5755,7 +6181,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') || @@ -5768,7 +6194,7 @@ 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 - . @'); } } } @@ -5943,8 +6369,7 @@ sub user_search_result { ($currstate,$response,$forcenewuser) = &build_search_response($context,$srch,%srch_results); } else { - my $showdom = &display_domain_info($srch->{'srchdomain'}); - $response = ''. + my $showdom = &display_domain_info($srch->{'srchdomain'}); $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.'). @@ -6055,12 +6480,12 @@ sub build_search_response { my ($context,$srch,%srch_results) = @_; my ($currstate,$response,$forcenewuser); my %names = ( - 'uname' => 'username', - 'lastname' => 'last name', + 'uname' => 'username', + 'lastname' => 'last name', 'lastfirst' => 'last name, first name', - 'crs' => 'this course', - 'dom' => 'LON-CAPA domain: ', - 'instd' => 'the institutional directory for domain: ', + 'crs' => 'this course', + 'dom' => 'LON-CAPA domain', + 'instd' => 'the institutional directory for domain', ); my %single = ( @@ -6080,14 +6505,20 @@ sub build_search_response { $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'}); + $response .= ': '.&display_domain_info($srch->{'srchdomain'}); } - } else { - $response = ''.&mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} ([_1]) in $names{$srch->{'srchin'}}",$srch->{'srchterm'}); + } else { # Search has nothing found. Prepare message to user. + $response = ''; if ($srch->{'srchin'} eq 'dom' || $srch->{'srchin'} eq 'instd') { - $response .= &display_domain_info($srch->{'srchdomain'}); + $response .= &mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} [_1] in $names{$srch->{'srchin'}}: [_2]", + ''.$srch->{'srchterm'}.'', + &display_domain_info($srch->{'srchdomain'})); + } else { + $response .= &mt("$nomatch{$srch->{'srchtype'}} found for the $names{$srch->{'srchby'}} [_1] in $names{$srch->{'srchin'}}.", + ''.$srch->{'srchterm'}.''); } $response .= ''; + if ($srch->{'srchin'} ne 'alc') { $forcenewuser = 1; my $cansrchinst = 0; @@ -6218,7 +6649,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? @@ -6233,15 +6665,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; } @@ -6259,12 +6692,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, + $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, + $defaultcredits,$crstype); } } } @@ -6286,8 +6721,10 @@ sub course_level_table { $result .= &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). -'
'.$lt{'act'}.''.$lt{'rol'}.''.$lt{'ext'}.''.$lt{'grs'}.''.$lt{'sta'}.''.$lt{'end'}.''.$lt{'act'}.''.$lt{'rol'}.''.$lt{'ext'}.''.$lt{'crd'}.''.$lt{'grs'}.''.$lt{'sta'}.''.$lt{'end'}.''.$plrole.''.$area.'
Domain: '.$domain.'
  
'.$courseform.''.$lt{'rol'}.''.$lt{'grs'}.''.$lt{'sta'}.''.$lt{'end'}.''.$lt{'scc'}.''.$lt{'rol'}.''.$lt{'grs'}.''.$lt{'crd'}.''.$lt{'sta'}.''.$lt{'end'}.'

'. + $courseform.(' ' x4).'

'. ''. '
'; + ''."\n"; + if ($showcredits) { + $otheritems .= '
'."\n". + ''."\n"; + } $otheritems .= <
0) { @types = sort(@types); @@ -6732,7 +7192,7 @@ sub update_selfenroll_config { my ($visible,$cansetvis,$vismsgs,$visactions) = &visible_in_cat($cdom,$cnum); if (ref($visactions) eq 'HASH') { if (!$visible) { - $r->print('
'.$visactions->{'miss'}.'
'.$visactions->{'yous'}. + $r->print('
'.$visactions->{'miss'}.'
'.$visactions->{'yous'}. '
'); if (ref($vismsgs) eq 'ARRAY') { $r->print('
'.$visactions->{'take'}.'
    '); @@ -6762,21 +7222,6 @@ sub get_selfenroll_titles { 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