--- loncom/interface/loncreateuser.pm 2007/12/14 00:20:53 1.209 +++ loncom/interface/loncreateuser.pm 2007/12/21 20:34:26 1.221 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.209 2007/12/14 00:20:53 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.221 2007/12/21 20:34:26 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -223,15 +223,15 @@ sub print_username_entry_form { my $start_page = &Apache::loncommon::start_page('User Management', $jscript,{'add_entries' => \%loaditems,}); - if ($env{'form.action'} eq 'singleuser') { + if ($env{'form.action'} eq 'custom') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.crtuser)", - text=>"Single user search", - faq=>282,bug=>'Instructor Interface',}); - } elsif ($env{'form.action'} eq 'custom') { + text=>"Pick custom role",}); + } else { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.crtuser)", - text=>"Pick custom role",}); + text=>"Single user search", + faq=>282,bug=>'Instructor Interface',}); } my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management'); my %existingroles=&Apache::lonuserutils::my_custom_roles(); @@ -245,22 +245,19 @@ sub print_username_entry_form { 'ecrp' => "Edit Custom Role Privileges", 'nr' => "Name of Role", 'cre' => "Custom Role Editor", - 'mod' => "to edit user information or add/modify roles", + 'mod' => "to modify user information or add/modify roles", + 'enrl' => "to enroll one student", ); my $help = &Apache::loncommon::help_open_menu(undef,undef,282,'Instructor Interface'); my $helpsiur=&Apache::loncommon::help_open_topic('Course_Change_Privileges'); + my $helpsist=&Apache::loncommon::help_open_topic('Course_Add_Student'); my $helpecpr=&Apache::loncommon::help_open_topic('Course_Editing_Custom_Roles'); my $sellink=&Apache::loncommon::selectstudent_link('crtuser','srchterm','srchdomain'); if ($sellink) { $sellink = "$lt{'or'} ".$sellink; } $r->print($start_page."\n".$crumbs); - if ($env{'form.action'} eq 'singleuser') { - $r->print(" -

$lt{'srch'} $sellink $lt{'mod'}$helpsiur

-$response"); - $r->print(&entry_form($defdom,$srch,$forcenewuser,$context)); - } elsif ($env{'form.action'} eq 'custom') { + if ($env{'form.action'} eq 'custom') { if (&Apache::lonnet::allowed('mcr','/')) { $r->print(< @@ -272,20 +269,41 @@ $lt{'nr'}: $choice ENDCUSTOM } + } else { + my $actiontext = $lt{'mod'}.$helpsiur; + if ($env{'form.action'} eq 'singlestudent') { + $actiontext = $lt{'enrl'}.$helpsist; + } + $r->print(" +

$lt{'srch'} $sellink $actiontext

"); + if ($env{'form.origform'} ne 'crtusername') { + $r->print("\n".$response); + } + $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response)); } $r->print(&Apache::loncommon::end_page()); } sub entry_form { - my ($dom,$srch,$forcenewuser,$context) = @_; + my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_; my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); - my $cancreate = &Apache::lonuserutils::can_create_user($dom,$context); - if (!$cancreate) { - $forcenewuser = ''; + my $usertype; + if (ref($srch) eq 'HASH') { + if (($srch->{'srchin'} eq 'dom') && + ($srch->{'srchby'} eq 'uname') && + ($srch->{'srchtype'} eq 'exact') && + ($srch->{'srchdomain'} ne '') && + ($srch->{'srchterm'} ne '')) { + my ($rules,$ruleorder) = + &Apache::lonnet::inst_userrules($srch->{'srchdomain'},'username'); + $usertype = &Apache::lonuserutils::check_usertype($srch->{'srchdomain'},$srch->{'srchterm'},$rules); + } } + my $cancreate = + &Apache::lonuserutils::can_create_user($dom,$context,$usertype); my $userpicker = &Apache::loncommon::user_picker($dom,$srch,$forcenewuser, - 'document.crtuser'); + 'document.crtuser',$cancreate,$usertype); my $srchbutton = &mt('Search'); my $output = <<"ENDBLOCK";
@@ -295,7 +313,7 @@ $userpicker
ENDBLOCK - if ($cancreate) { + if ($cancreate && $env{'form.phase'} eq '') { my $defdom=$env{'request.role.domain'}; my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain'); my $helpcrt=&Apache::loncommon::help_open_topic('Course_Change_Privileges'); @@ -315,6 +333,7 @@ ENDBLOCK

$lt{crnu}$helpcrt

+$responsemsg @@ -392,8 +411,8 @@ ENDSCRIPT 'firstname' => "first name", 'permanentemail' => "permanent e-mail", ); + $r->print(&Apache::loncommon::start_page('User Management',$jscript)); if ($operation eq 'createuser') { - $r->print(&Apache::loncommon::start_page('User Management',$jscript)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.usersrchform,'','')", text=>"Create/modify user", @@ -405,9 +424,17 @@ ENDSCRIPT $r->print("$lt{'usrch'}
"); $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); $r->print('

'.$lt{'usel'}.'

'); - } else { + } elsif ($operation eq 'enrollstudent') { + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>"javascript:backPage(document.usersrchform,'','')", + text=>"Create/modify student", + faq=>282,bug=>'Instructor Interface',}, + {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')", + text=>"Select Student", + faq=>282,bug=>'Instructor Interface',}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); $r->print($jscript."$lt{'stusrch'}
"); - $r->print(&Apache::londropadd::single_user_entry_form($srch->{'srchdomain'},$srch)); + $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); $r->print('

'.$lt{'stusel'}.'

'); } $r->print(''. @@ -453,14 +480,8 @@ ENDSCRIPT ' '."\n". ' '."\n". ' '."\n". - ' '."\n"); - $r->print($response); - if ($operation eq 'createuser') { - $r->print(''.&Apache::loncommon::end_page()); - } else { - $r->print(''."\n". - ''."\n"); - } + ' '."\n"); + $r->print($response.''.&Apache::loncommon::end_page()); } sub print_user_query_page { @@ -472,17 +493,50 @@ sub print_user_query_page { } sub print_user_modification_page { - my ($r,$ccuname,$ccdomain,$srch,$response,$context) = @_; + my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_; if (($ccuname eq '') || ($ccdomain eq '')) { - my $usermsg = &mt('No username and/or domain provided.'); + my $usermsg = &mt('No username and/or domain provided.'); + $env{'form.phase'} = ''; &print_username_entry_form($r,$context,$usermsg); return; } + my ($form,$formname); + if ($env{'form.action'} eq 'singlestudent') { + $form = 'document.enrollstudent'; + $formname = 'enrollstudent'; + } else { + $form = 'document.cu'; + $formname = 'cu'; + } my %abv_auth = &auth_abbrev(); my ($curr_authtype,%rulematch,%inst_results,$curr_kerb_ver,$newuser, %alerts,%curr_rules,%got_rules); my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain); if ($uhome eq 'no_host') { + my $usertype; + my ($rules,$ruleorder) = + &Apache::lonnet::inst_userrules($ccdomain,'username'); + $usertype = + &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules); + my $cancreate = + &Apache::lonuserutils::can_create_user($ccdomain,$context, + $usertype); + if (!$cancreate) { + my $helplink = ' href="javascript:helpMenu('."'display'".')"'; + my %usertypetext = ( + official => 'institutional', + unofficial => 'non-institutional', + ); + my $response; + if ($env{'form.origform'} eq 'crtusername') { + $response = ''.&mt('No match was found for the username ([_1]) in LON-CAPA domain: [_2]',$ccuname,$ccdomain). + '
'; + } + $response .= ''.&mt("You are not authorized to create new $usertypetext{$usertype} users in this domain.").' '.&mt('Contact the helpdesk for assistance.',$helplink).'

'; + $env{'form.phase'} = ''; + &print_username_entry_form($r,$context,$response); + return; + } $newuser = 1; my $checkhash; my $checks = { 'username' => 1 }; @@ -503,9 +557,10 @@ sub print_user_modification_page { $domdesc,$curr_rules{$ccdomain}{'username'}, 'username'); } + $env{'form.phase'} = ''; &print_username_entry_form($r,$context,$userchkmsg); return; - } + } } } } else { @@ -520,7 +575,7 @@ sub print_user_modification_page { } } if ($response) { - $response = '
'.$response + $response = '
'.$response; } my $defdom=$env{'request.role.domain'}; @@ -540,165 +595,35 @@ sub print_user_modification_page { my $pjump_def = &Apache::lonhtmlcommon::pjump_javascript_definition(); my $dc_setcourse_code = ''; my $nondc_setsection_code = ''; - my %loaditem; - my $groupslist; - my %curr_groups = &Apache::longroup::coursegroups(); - if (%curr_groups) { - $groupslist = join('","',sort(keys(%curr_groups))); - $groupslist = '"'.$groupslist.'"'; - } - - if ($env{'request.role'} =~ m-^dc\./($match_domain)/$-) { - my $dcdom = $1; - $loaditem{'onload'} = "document.cu.coursedesc.value='';"; - my @rolevals = ('st','ta','ep','in','cc'); - my (@crsroles,@grproles); - for (my $i=0; $i<@rolevals; $i++) { - $crsroles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Course'); - $grproles[$i]=&Apache::lonnet::plaintext($rolevals[$i],'Group'); - } - my $rolevalslist = join('","',@rolevals); - my $crsrolenameslist = join('","',@crsroles); - my $grprolenameslist = join('","',@grproles); - my $pickcrsfirst = '<--'.&mt('Pick course first'); - my $pickgrpfirst = '<--'.&mt('Pick group first'); - $dc_setcourse_code = <<"ENDSCRIPT"; - function setCourse() { - var course = document.cu.dccourse.value; - if (course != "") { - if (document.cu.dcdomain.value != document.cu.origdom.value) { - alert("You must select a course in the current domain"); - return; - } - var userrole = document.cu.role.options[document.cu.role.selectedIndex].value - var section=""; - var numsections = 0; - var newsecs = new Array(); - for (var i=0; i 1)) { - alert("In each course, each user may only have one student role at a time. You had selected "+numsections+" sections.\\nPlease modify your selections so they include no more than one section.") - return; - } - for (var j=0; j 0)) { - alert("Section designations do not apply to Course Coordinator roles.\\nA course coordinator role will be added with access to all sections."); - section = ""; - } - var coursename = "_$dcdom"+"_"+course+"_"+userrole - var numcourse = getIndex(document.cu.dccourse); - if (numcourse == "-1") { - alert("There was a problem with your course selection"); - return - } - else { - document.cu.elements[numcourse].name = "act"+coursename; - var numnewsec = getIndex(document.cu.newsec); - if (numnewsec != "-1") { - document.cu.elements[numnewsec].name = "sec"+coursename; - document.cu.elements[numnewsec].value = section; - } - var numstart = getIndex(document.cu.start); - if (numstart != "-1") { - document.cu.elements[numstart].name = "start"+coursename; - } - var numend = getIndex(document.cu.end); - if (numend != "-1") { - document.cu.elements[numend].name = "end"+coursename - } - } - } - document.cu.submit(); - } - - function getIndex(caller) { - for (var i=0;i'."\n".$jsback."\n". - $javascript_validations.''; + my $js = &validation_javascript($context,$ccdomain,$pjump_def, + $groupslist,$newuser,$formname,\%loaditem); my $start_page = &Apache::loncommon::start_page('User Management', $js,{'add_entries' => \%loaditem,}); + my %breadcrumb_text = &singleuser_breadcrumb(); &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.cu)", - text=>"Create/modify user", + ({href=>"javascript:backPage($form)", + text=>$breadcrumb_text{'search'}, faq=>282,bug=>'Instructor Interface',}); if ($env{'form.phase'} eq 'userpicked') { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.cu,'get_user_info','select')", - text=>"Select a user", + ({href=>"javascript:backPage($form,'get_user_info','select')", + text=>$breadcrumb_text{'userpicked'}, faq=>282,bug=>'Instructor Interface',}); } &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.cu,'$env{'form.phase'}','modify')", - text=>"Set user role", + ({href=>"javascript:backPage($form,'$env{'form.phase'}','modify')", + text=>$breadcrumb_text{'modify'}, faq=>282,bug=>'Instructor Interface',}); my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management'); my $forminfo =<<"ENDFORMINFO"; -
+ @@ -712,7 +637,7 @@ ENDFORMINFO $inccourses{$1.'_'.$2}=1; } } - if ($uhome eq 'no_host') { + if ($newuser) { my $portfolioform; if (&Apache::lonnet::allowed('mpq',$env{'request.role.domain'})) { # Current user has quota modification privileges @@ -721,6 +646,7 @@ ENDFORMINFO &initialize_authen_forms($ccdomain); my %lt=&Apache::lonlocal::texthash( 'cnu' => 'Create New User', + 'ast' => 'as a student', 'ind' => 'in domain', 'lg' => 'Login Data', 'hs' => "Home Server", @@ -734,12 +660,15 @@ $forminfo $loginscript -

$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain

+

$lt{'cnu'} "$ccuname" $lt{'ind'} $ccdomain ENDTITLE - $r->print('
'); + if ($env{'form.action'} eq 'singlestudent') { + $r->print(' ('.$lt{'ast'}.')'); + } + $r->print('

'."\n".'
'); my $personal_table = - &personal_data_display($ccuname,$ccdomain,$newuser, - $context,%inst_results); + &personal_data_display($ccuname,$ccdomain,$newuser,$context, + $inst_results{$ccuname.':'.$ccdomain}); $r->print($personal_table); my ($home_server_pick,$numlib) = &Apache::loncommon::home_server_form_item($ccdomain,'hserver', @@ -802,25 +731,34 @@ ENDAUTH } else { $r->print(&Apache::lonuserutils::set_login($ccdomain,$authformkrb,$authformint,$authformloc)); } - $r->print(< -ENDPORT + $r->print($portfolioform); + if ($env{'form.action'} eq 'singlestudent') { + $r->print(&date_sections_select($context,$newuser,$formname, + $permission)); + } + $r->print('
'); } else { # user already exists my %lt=&Apache::lonlocal::texthash( 'cup' => "Modify existing user: ", + 'ens' => "Enroll one student: ", 'id' => "in domain", ); $r->print(<$lt{'cup'} "$ccuname" $lt{'id'} "$ccdomain" +

ENDCHANGEUSER - $r->print('
'); + if ($env{'form.action'} eq 'singlestudent') { + $r->print($lt{'ens'}); + } else { + $r->print($lt{'cup'}); + } + $r->print(' "'.$ccuname.'" '.$lt{'id'}.' "'.$ccdomain.'"

'. + "\n".'
'); my ($personal_table,$showforceid) = - &personal_data_display($ccuname,$ccdomain,$newuser, - $context,%inst_results); + &personal_data_display($ccuname,$ccdomain,$newuser,$context, + $inst_results{$ccuname.':'.$ccdomain}); $r->print($personal_table); if ($showforceid) { $r->print(&Apache::lonuserutils::forceid_change($context)); @@ -852,187 +790,309 @@ ENDNOPORTPRIV if ($user_quota_text ne '') { $r->print($user_quota_text); } - $r->print('
'); - + if ($env{'form.action'} eq 'singlestudent') { + $r->print(&date_sections_select($context,$newuser,$formname)); + } } elsif ($user_quota_text ne '') { - $r->print('
'.$user_quota_text.'
'); + $r->print('
'.$user_quota_text); + if ($env{'form.action'} eq 'singlestudent') { + $r->print(&date_sections_select($context,$newuser,$formname)); + } + } else { + if ($env{'form.action'} eq 'singlestudent') { + $r->print('
'. + &date_sections_select($context,$newuser,$formname)); + } } - $r->print(''); - my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname); - # Build up table of user roles to allow revocation of a role. - my ($tmp) = keys(%rolesdump); - unless ($tmp =~ /^(con_lost|error)/i) { - my $now=time; - my %lt=&Apache::lonlocal::texthash( - 'rer' => "Existing Roles", - 'rev' => "Revoke", + $r->print('
'); + if ($env{'form.action'} ne 'singlestudent') { + &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses); + } + } ## End of new user/old user logic + + if ($env{'form.action'} eq 'singlestudent') { + $r->print('
'."\n"); + } else { + $r->print('

'.&mt('Add Roles').'

'); + my $addrolesdisplay = 0; + if ($context eq 'domain' || $context eq 'author') { + $addrolesdisplay = &new_coauthor_roles($r,$ccuname,$ccdomain); + } + if ($context eq 'domain') { + my $add_domainroles = &new_domain_roles($r); + if (!$addrolesdisplay) { + $addrolesdisplay = $add_domainroles; + } + $r->print(&course_level_dc($env{'request.role.domain'},'Course')); + $r->print('
'."\n"); + } elsif ($context eq 'author') { + if ($addrolesdisplay) { + $r->print('
print(' onClick="verify_message(this.form)" \>'."\n"); + } else { + $r->print('onClick="this.form.submit()" \>'."\n"); + } + } else { + $r->print('
'. + &mt('Back to previous page').''); + } + } else { + $r->print(&course_level_table(%inccourses)); + $r->print('
'."\n"); + } + } + $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain'])); + $r->print(''); + $r->print(''); + $r->print("".&Apache::loncommon::end_page()); + return; +} + +sub singleuser_breadcrumb { + my %breadcrumb_text; + if ($env{'form.action'} eq 'singlestudent') { + $breadcrumb_text{'search'} = 'Enroll a student'; + $breadcrumb_text{'userpicked'} = 'Select a user', + $breadcrumb_text{'modify'} = 'Set section/dates', + } else { + $breadcrumb_text{'search'} = 'Create/modify user'; + $breadcrumb_text{'userpicked'} = 'Select a user', + $breadcrumb_text{'modify'} = 'Set user role', + } + return %breadcrumb_text; +} + +sub date_sections_select { + my ($context,$newuser,$formname,$permission) = @_; + my $cid = $env{'request.course.id'}; + my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity($cid); + my $date_table = '

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

'."\n". + &Apache::lonuserutils::date_setting_table(undef,undef,$context, + undef,$formname,$permission); + my $rowtitle = 'Section'; + my $secbox = '

'.&mt('Section').'

'."\n". + &Apache::lonuserutils::section_picker($cdom,$cnum,'st',$rowtitle, + $permission); + my $output = $date_table.$secbox; + return $output; +} + +sub validation_javascript { + my ($context,$ccdomain,$pjump_def,$groupslist,$newuser,$formname, + $loaditem) = @_; + my $dc_setcourse_code = ''; + my $nondc_setsection_code = ''; + if ($context eq 'domain') { + my $dcdom = $env{'request.role.domain'}; + $loaditem->{'onload'} = "document.cu.coursedesc.value='';"; + $dc_setcourse_code = &Apache::lonuserutils::dc_setcourse_js('cu','singleuser'); + } else { + $nondc_setsection_code = + &Apache::lonuserutils::setsections_javascript($formname,$groupslist); + } + my $js = &user_modification_js($pjump_def,$dc_setcourse_code, + $nondc_setsection_code,$groupslist); + + my ($jsback,$elements) = &crumb_utilities(); + my $javascript_validations; + if ((&Apache::lonnet::allowed('mau',$ccdomain)) || ($newuser)) { + my ($krbdef,$krbdefdom) = + &Apache::loncommon::get_kerberos_defaults($ccdomain); + $javascript_validations = + &Apache::lonuserutils::javascript_validations('createuser',$krbdefdom,undef, + undef,$ccdomain); + } + $js .= "\n". + ''; + return $js; +} + +sub display_existing_roles { + my ($r,$ccuname,$ccdomain,$inccourses) = @_; + my %rolesdump=&Apache::lonnet::dump('roles',$ccdomain,$ccuname); + # Build up table of user roles to allow revocation and re-enabling of roles. + my ($tmp) = keys(%rolesdump); + if ($tmp !~ /^(con_lost|error)/i) { + my $now=time; + my %lt=&Apache::lonlocal::texthash( + 'rer' => "Existing Roles", + 'rev' => "Revoke", 'del' => "Delete", - 'ren' => "Re-Enable", + 'ren' => "Re-Enable", 'rol' => "Role", 'ext' => "Extent", 'sta' => "Start", - 'end' => "End" - ); - my (%roletext,%sortrole,%roleclass,%rolepriv); - foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]); - my $b1=join('_',(split('_',$b))[1,0]); - return $a1 cmp $b1; - } keys(%rolesdump)) { - next if ($area =~ /^rolesdef/); - my $envkey=$area; - my $role = $rolesdump{$area}; - my $thisrole=$area; - $area =~ s/\_\w\w$//; - my ($role_code,$role_end_time,$role_start_time) = - split(/_/,$role); + 'end' => "End", + ); + my (%roletext,%sortrole,%roleclass,%rolepriv); + foreach my $area (sort { my $a1=join('_',(split('_',$a))[1,0]); + my $b1=join('_',(split('_',$b))[1,0]); + return $a1 cmp $b1; + } keys(%rolesdump)) { + next if ($area =~ /^rolesdef/); + my $envkey=$area; + my $role = $rolesdump{$area}; + my $thisrole=$area; + $area =~ s/\_\w\w$//; + my ($role_code,$role_end_time,$role_start_time) = + split(/_/,$role); # Is this a custom role? Get role owner and title. - my ($croleudom,$croleuname,$croletitle)= - ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$}); - my $allowed=0; - my $delallowed=0; - my $sortkey=$role_code; - my $class='Unknown'; - if ($area =~ m{^/($match_domain)/($match_courseid)} ) { - $class='Course'; - my ($coursedom,$coursedir) = ($1,$2); - $sortkey.="\0$coursedom"; - # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3). - my %coursedata= - &Apache::lonnet::coursedescription($1.'_'.$2); - my $carea; - if (defined($coursedata{'description'})) { - $carea=$coursedata{'description'}. - '
'.&mt('Domain').': '.$coursedom.(' 'x8). + my ($croleudom,$croleuname,$croletitle)= + ($role_code=~m{^cr/($match_domain)/($match_username)/(\w+)$}); + my $allowed=0; + my $delallowed=0; + my $sortkey=$role_code; + my $class='Unknown'; + if ($area =~ m{^/($match_domain)/($match_courseid)} ) { + $class='Course'; + my ($coursedom,$coursedir) = ($1,$2); + $sortkey.="\0$coursedom"; + # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3). + my %coursedata= + &Apache::lonnet::coursedescription($1.'_'.$2); + my $carea; + if (defined($coursedata{'description'})) { + $carea=$coursedata{'description'}. + '
'.&mt('Domain').': '.$coursedom.(' 'x8). &Apache::loncommon::syllabuswrapper('Syllabus',$coursedir,$coursedom); - $sortkey.="\0".$coursedata{'description'}; - $class=$coursedata{'type'}; - } else { - $carea=&mt('Unavailable course').': '.$area; - $sortkey.="\0".&mt('Unavailable course').': '.$area; - } - $sortkey.="\0$coursedir"; - $inccourses{$1.'_'.$2}=1; - if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) || - (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { - $allowed=1; - } - if ((&Apache::lonnet::allowed('dro',$1)) || - (&Apache::lonnet::allowed('dro',$ccdomain))) { - $delallowed=1; - } + $sortkey.="\0".$coursedata{'description'}; + $class=$coursedata{'type'}; + } else { + $carea=&mt('Unavailable course').': '.$area; + $sortkey.="\0".&mt('Unavailable course').': '.$area; + } + $sortkey.="\0$coursedir"; + $inccourses->{$1.'_'.$2}=1; + if ((&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2)) || + (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { + $allowed=1; + } + if ((&Apache::lonnet::allowed('dro',$1)) || + (&Apache::lonnet::allowed('dro',$ccdomain))) { + $delallowed=1; + } # - custom role. Needs more info, too - if ($croletitle) { - if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) { - $allowed=1; - $thisrole.='.'.$role_code; - } - } - # Compute the background color based on $area - if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) { - $carea.='
Section: '.$3; - $sortkey.="\0$3"; - } - $area=$carea; - } else { - $sortkey.="\0".$area; - # Determine if current user is able to revoke privileges - if ($area=~m{^/($match_domain)/}) { - if ((&Apache::lonnet::allowed('c'.$role_code,$1)) || + if ($croletitle) { + if (&Apache::lonnet::allowed('ccr',$1.'/'.$2)) { + $allowed=1; + $thisrole.='.'.$role_code; + } + } + # Compute the background color based on $area + if ($area=~m{^/($match_domain)/($match_courseid)/(\w+)}) { + $carea.='
Section: '.$3; + $sortkey.="\0$3"; + if (!$allowed) { + if ($env{'request.course.sec'} eq $3) { + if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) { + $allowed = 1; + } + } + } + } + $area=$carea; + } else { + $sortkey.="\0".$area; + # Determine if current user is able to revoke privileges + if ($area=~m{^/($match_domain)/}) { + if ((&Apache::lonnet::allowed('c'.$role_code,$1)) || (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { - $allowed=1; - } - if (((&Apache::lonnet::allowed('dro',$1)) || - (&Apache::lonnet::allowed('dro',$ccdomain))) && - ($role_code ne 'dc')) { - $delallowed=1; - } - } else { - if (&Apache::lonnet::allowed('c'.$role_code,'/')) { - $allowed=1; - } - } - if ($role_code eq 'ca' || $role_code eq 'au') { - $class='Construction Space'; - } elsif ($role_code eq 'su') { - $class='System'; - } else { - $class='Domain'; - } - } - if (($role_code eq 'ca') || ($role_code eq 'aa')) { - $area=~m{/($match_domain)/($match_username)}; - if (&Apache::lonuserutils::authorpriv($2,$1)) { - $allowed=1; - } else { - $allowed=0; - } - } - my $row = ''; - $row.= '
"; - $sortrole{$sortkey}=$envkey; - $roletext{$envkey}=$row; - $roleclass{$envkey}=$class; - $rolepriv{$envkey}=$allowed; - #$r->print($row); - } # end of foreach (table building loop) - my $rolesdisplay = 0; - my %output = (); - foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') { - $output{$type} = ''; - foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) { - if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) { - $output{$type}.= - &Apache::loncommon::start_data_table_row(). - $roletext{$sortrole{$which}}. - &Apache::loncommon::end_data_table_row(); - } - } - unless($output{$type} eq '') { - $output{$type} = ''. - "". - $output{$type}; - $rolesdisplay = 1; - } - } - if ($rolesdisplay == 1) { - $r->print(' + } else { + $row.=&mt('expired or revoked'); + } + } + $row.='"; + $sortrole{$sortkey}=$envkey; + $roletext{$envkey}=$row; + $roleclass{$envkey}=$class; + $rolepriv{$envkey}=$allowed; + #$r->print($row); + } # end of foreach (table building loop) + my $rolesdisplay = 0; + my %output = (); + foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') { + $output{$type} = ''; + foreach my $which (sort {uc($a) cmp uc($b)} (keys(%sortrole))) { + if ( ($roleclass{$sortrole{$which}} =~ /^\Q$type\E/ ) && ($rolepriv{$sortrole{$which}}) ) { + $output{$type}.= + &Apache::loncommon::start_data_table_row(). + $roletext{$sortrole{$which}}. + &Apache::loncommon::end_data_table_row(); + } + } + unless($output{$type} eq '') { + $output{$type} = ''. + "". + $output{$type}; + $rolesdisplay = 1; + } + } + if ($rolesdisplay == 1) { + $r->print('

'.$lt{'rer'}.'

'. &Apache::loncommon::start_data_table("LC_createuser"). &Apache::loncommon::start_data_table_header_row(). @@ -1040,30 +1100,33 @@ ENDNOPORTPRIV ''. &Apache::loncommon::end_data_table_header_row()); - foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') { - if ($output{$type}) { - $r->print($output{$type}."\n"); - } - } - $r->print(&Apache::loncommon::end_data_table()); - } - } # End of unless - } ## End of new user/old user logic + foreach my $type ('Construction Space','Course','Group','Domain','System','Unknown') { + if ($output{$type}) { + $r->print($output{$type}."\n"); + } + } + $r->print(&Apache::loncommon::end_data_table()); + } + } # End of check for keys in rolesdump + return; +} + +sub new_coauthor_roles { + my ($r,$ccuname,$ccdomain) = @_; my $addrolesdisplay = 0; - $r->print('

'.&mt('Add Roles').'

'); -# -# Co-Author -# + # + # Co-Author + # if (&Apache::lonuserutils::authorpriv($env{'user.name'}, $env{'request.role.domain'}) && ($env{'user.name'} ne $ccuname || $env{'user.domain'} ne $ccdomain)) { # No sense in assigning co-author role to yourself $addrolesdisplay = 1; - my $cuname=$env{'user.name'}; + my $cuname=$env{'user.name'}; my $cudom=$env{'request.role.domain'}; - my %lt=&Apache::lonlocal::texthash( - 'cs' => "Construction Space", - 'act' => "Activate", + my %lt=&Apache::lonlocal::texthash( + 'cs' => "Construction Space", + 'act' => "Activate", 'rol' => "Role", 'ext' => "Extent", 'sta' => "Start", @@ -1072,16 +1135,16 @@ ENDNOPORTPRIV 'caa' => "Assistant Co-Author", 'ssd' => "Set Start Date", 'sed' => "Set End Date" - ); - $r->print('

'.$lt{'cs'}.'

'."\n". - &Apache::loncommon::start_data_table()."\n". - &Apache::loncommon::start_data_table_header_row()."\n". - ''. - ''. - ''."\n". - &Apache::loncommon::end_data_table_header_row()."\n". - &Apache::loncommon::start_data_table_row()."\n". - ''. + ''. + ''."\n". + &Apache::loncommon::end_data_table_header_row()."\n". + &Apache::loncommon::start_data_table_row().' + @@ -1092,8 +1155,8 @@ ENDNOPORTPRIV '."\n". - &Apache::loncommon::end_data_table_row()."\n". - &Apache::loncommon::start_data_table_row()."\n". + &Apache::loncommon::end_data_table_row()."\n". + &Apache::loncommon::start_data_table_row()."\n". ' @@ -1103,24 +1166,30 @@ ENDNOPORTPRIV '."\n". - &Apache::loncommon::end_data_table_row()."\n". - &Apache::loncommon::end_data_table()); + &Apache::loncommon::end_data_table_row()."\n". + &Apache::loncommon::end_data_table()); } elsif ($env{'request.role'} =~ /^au\./) { if (!(&Apache::lonuserutils::authorpriv($env{'user.name'}, $env{'request.role.domain'}))) { $r->print(''. &mt('You do not have privileges to assign co-author roles.'). ''); - } elsif (($env{'user.name'} eq $ccuname) && + } elsif (($env{'user.name'} eq $ccuname) && ($env{'user.domain'} eq $ccdomain)) { - $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted')); + $r->print(&mt('Assigning yourself a co-author or assistant co-author role in your own author area in Construction Space is not permitted')); } } -# -# Domain level -# + return $addrolesdisplay;; +} + +sub new_domain_roles { + my ($r) = @_; + my $addrolesdisplay = 0; + # + # Domain level + # my $num_domain_level = 0; - my $domaintext = + my $domaintext = '

'.&mt('Domain Level').'

'. &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). @@ -1132,12 +1201,12 @@ ENDNOPORTPRIV foreach my $role ('dc','li','dg','au','sc') { if (&Apache::lonnet::allowed('c'.$role,$thisdomain)) { my $plrole=&Apache::lonnet::plaintext($role); - my %lt=&Apache::lonlocal::texthash( + my %lt=&Apache::lonlocal::texthash( 'ssd' => "Set Start Date", 'sed' => "Set End Date" - ); + ); $num_domain_level ++; - $domaintext .= + $domaintext .= &Apache::loncommon::start_data_table_row(). ' @@ -1150,40 +1219,14 @@ ENDNOPORTPRIV "javascript:pjump('."'date_end','End Date $plrole',document.cu.end_$thisdomain\_$role.value,'end_$thisdomain\_$role','cu.pres','dateset'".')">'.$lt{'sed'}.''. &Apache::loncommon::end_data_table_row(); } - } + } } $domaintext.= &Apache::loncommon::end_data_table(); if ($num_domain_level > 0) { $r->print($domaintext); $addrolesdisplay = 1; } -# -# Course level -# - - if ($env{'request.role'} =~ m{^dc\./($match_domain)/$}) { - $r->print(&course_level_dc($1,'Course')); - $r->print('
'."\n"); - } elsif ($env{'request.role'} =~ m{^au\./($match_domain)/$}) { - if ($addrolesdisplay) { - $r->print('
print(' onClick="verify_message(this.form)" \>'."\n"); - } else { - $r->print('onClick="this.form.submit()" \>'."\n"); - } - } else { - $r->print('
'. - &mt('Back to previous page').''); - } - } else { - $r->print(&course_level_table(%inccourses)); - $r->print('
'."\n"); - } - $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain'])); - $r->print(''); - $r->print(''); - $r->print("".&Apache::loncommon::end_page()); + return $addrolesdisplay; } sub user_authentication { @@ -1353,16 +1396,18 @@ sub modify_login_block { } sub personal_data_display { - my ($ccuname,$ccdomain,$newuser,$context,%inst_results) = @_; - my ($output,$showforceid,%userenv,%domconfig); + my ($ccuname,$ccdomain,$newuser,$context,$inst_results) = @_; + my ($output,$showforceid,%userenv,%canmodify); + my @userinfo = ('firstname','middlename','lastname','generation', + 'permanentemail','id'); if (!$newuser) { # Get the users information %userenv = &Apache::lonnet::get('environment', ['firstname','middlename','lastname','generation', 'permanentemail','id'],$ccdomain,$ccuname); - %domconfig = - &Apache::lonnet::get_dom('configuration',['usermodification'], - $ccdomain); + %canmodify = + &Apache::lonuserutils::can_modify_userinfo($context,$ccdomain, + \@userinfo); } my %lt=&Apache::lonlocal::texthash( 'pd' => "Personal Data", @@ -1374,8 +1419,6 @@ sub personal_data_display { 'id' => "ID/Student Number", 'lg' => "Login Data" ); - my @userinfo = ('firstname','middlename','lastname','generation', - 'permanentemail','id'); my %textboxsize = ( firstname => '15', middlename => '15', @@ -1394,39 +1437,24 @@ sub personal_data_display { } $output .= &Apache::lonhtmlcommon::row_title($rowtitle,undef,'LC_oddrow_value')."\n"; if ($newuser) { - if ($inst_results{$item} ne '') { - $output .= ''.$inst_results{$item}; + if (ref($inst_results) eq 'HASH') { + if ($inst_results->{$item} ne '') { + $output .= ''.$inst_results->{$item}; + } else { + $output .= ''; + } } else { $output .= ''; } } else { - my $canmodify = 0; - if (&Apache::lonnet::allowed('mau',$ccdomain)) { - $canmodify = 1; - } else { - if (ref($domconfig{'usermodification'}) eq 'HASH') { - if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') { - foreach my $key (keys(%{$domconfig{'usermodification'}{$context}})) { - if (ref($domconfig{'usermodification'}{$context}{$key}) eq 'HASH') { - if ($domconfig{'usermodification'}{$context}{$key}{$item}) { - $canmodify = 1; - last; - } - } - } - } - } elsif ($context eq 'course') { - $canmodify = 1; - } - } - if ($canmodify) { + if ($canmodify{$item}) { $output .= ''; } else { $output .= $userenv{$item}; } if ($item eq 'id') { - $showforceid = $canmodify; - } + $showforceid = $canmodify{$item}; + } } $output .= &Apache::lonhtmlcommon::row_closure(1); } @@ -1448,39 +1476,39 @@ sub update_user_data { my $end = '

'; my $rtnlink = ''. - &mt('Return to previous page').''.&Apache::loncommon::end_page(); + &mt('Return to previous page').''. + &Apache::loncommon::end_page(); + my $now = time; my $title; if (exists($env{'form.makeuser'})) { $title='Set Privileges for New User'; } else { $title='Modify User Privileges'; } - + my $newuser = 0; my ($jsback,$elements) = &crumb_utilities(); my $jscript = ''."\n"; - + my %breadcrumb_text = &singleuser_breadcrumb(); $r->print(&Apache::loncommon::start_page($title,$jscript)); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.userupdate)", - text=>"Create/modify user", + text=>$breadcrumb_text{'search'}, faq=>282,bug=>'Instructor Interface',}); if ($env{'form.prevphase'} eq 'userpicked') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.userupdate,'get_user_info','select')", - text=>"Select a user", + text=>$breadcrumb_text{'userpicked'}, faq=>282,bug=>'Instructor Interface',}); } &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')", - text=>"Set user role", + text=>$breadcrumb_text{'modify'}, faq=>282,bug=>'Instructor Interface',}, {href=>"/adm/createuser", text=>"Result", faq=>282,bug=>'Instructor Interface',}); $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); - - my %disallowed; $r->print(&update_result_form($uhome)); # Check Inputs if (! $env{'form.ccuname'} ) { @@ -1505,6 +1533,9 @@ sub update_user_data { $end.$rtnlink); return; } + if ($uhome eq 'no_host') { + $newuser = 1; + } if (! exists($env{'form.makeuser'})) { # Modifying an existing user, so check the validity of the name if ($uhome eq 'no_host') { @@ -1542,7 +1573,6 @@ sub update_user_data { return; } - $r->print('

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

'); my (%alerts,%rulematch,%inst_results,%curr_rules); @@ -1569,7 +1599,7 @@ sub update_user_data { my %checkhash; my %checks = ('id' => 1); %{$checkhash{$env{'form.ccuname'}.':'.$env{'form.ccdomain'}}} = ( - 'newuser' => 1, + 'newuser' => $newuser, 'id' => $env{'form.cid'}, ); if ($env{'form.cid'} ne '') { @@ -1603,10 +1633,10 @@ sub update_user_data { $env{'form.cgeneration'},undef,$desiredhost, $env{'form.cpermanentemail'}); $r->print(&mt('Generating user').': '.$result); - my $home = &Apache::lonnet::homeserver($env{'form.ccuname'}, + $uhome = &Apache::lonnet::homeserver($env{'form.ccuname'}, $env{'form.ccdomain'}); - $r->print('
'.&mt('Home server').': '.$home.' '. - &Apache::lonnet::hostname($home)); + $r->print('
'.&mt('Home server').': '.$uhome.' '. + &Apache::lonnet::hostname($uhome)); } elsif (($env{'form.login'} ne 'nochange') && ($env{'form.login'} ne '' )) { # Modify user privileges @@ -1628,6 +1658,10 @@ sub update_user_data { } } ## + my (@userroles,%userupdate,$cnum,$cdom,$namechanged); + if ($context eq 'course') { + ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); + } if (! $env{'form.makeuser'} ) { # Check for need to change my %userenv = &Apache::lonnet::get @@ -1643,26 +1677,15 @@ sub update_user_data { my %domconfig = &Apache::lonnet::get_dom('configuration',['usermodification'], $env{'form.ccdomain'}); - my @roletypes = ('active','future'); - my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@roletypes,undef,$env{'request.role.domain'}); - my @userroles; - my ($cnum,$cdom,$auname,$audom); - if ($context eq 'course') { - $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - if ($cnum eq '' || $cdom eq '') { - my $cid = $env{'request.course.id'}; - my %coursehash = - &Apache::lonnet::coursedescription($cid,{'one_time' => 1}); - $cdom = $coursehash{'domain'}; - $cnum = $coursehash{'num'}; - } - } elsif ($context eq 'author') { + my @statuses = ('active','future'); + my %roles = &Apache::lonnet::get_my_roles($env{'form.ccuname'},$env{'form.ccdomain'},'userroles',\@statuses,undef,$env{'request.role.domain'}); + my ($auname,$audom); + if ($context eq 'author') { $auname = $env{'user.name'}; $audom = $env{'user.domain'}; } foreach my $item (keys(%roles)) { - my ($rolenum,$roledom,$role) = split(/:/,$item); + my ($rolenum,$roledom,$role) = split(/:/,$item,-1); if ($context eq 'course') { if ($cnum ne '' && $cdom ne '') { if ($rolenum eq $cnum && $roledom eq $cdom) { @@ -1679,27 +1702,33 @@ sub update_user_data { } } } - # Check for course or co-author roles being activated or re-enabled - if ($context eq 'author' || $context eq 'course') { - foreach my $key (keys(%env)) { - if ($context eq 'author') { - if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); - } - } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); - } - } - } elsif ($context eq 'course') { - if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); + if ($env{'form.action'} eq 'singlestudent') { + if (!grep(/^st$/,@userroles)) { + push(@userroles,'st'); + } + } else { + # Check for course or co-author roles being activated or re-enabled + if ($context eq 'author' || $context eq 'course') { + foreach my $key (keys(%env)) { + if ($context eq 'author') { + if ($key=~/^form\.act_\Q$audom\E_\Q$auname\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } + } elsif ($key =~/^form\.ren\:\Q$audom\E\/\Q$auname\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } } - } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) { - if (!grep(/^\Q$1\E$/,@userroles)) { - push(@userroles,$1); + } elsif ($context eq 'course') { + if ($key=~/^form\.act_\Q$cdom\E_\Q$cnum\E_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } + } elsif ($key =~/^form\.ren\:\Q$cdom\E\/\Q$cnum\E(\/?\w*)_([^_]+)/) { + if (!grep(/^\Q$1\E$/,@userroles)) { + push(@userroles,$1); + } } } } @@ -1714,33 +1743,12 @@ sub update_user_data { push(@longroles,&Apache::lonnet::plaintext($role)); } } - foreach my $item ('firstname','middlename','lastname','generation','permanentemail','id') { - my $canmodify = 0; - if (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'})) { - $canmodify = 1; - } else { - if ($context eq 'course' || $context eq 'author') { - if (ref($domconfig{'usermodification'}) eq 'HASH') { - if (ref($domconfig{'usermodification'}{$context}) eq 'HASH') { - foreach my $role (@userroles) { - if (ref($domconfig{'usermodification'}{$context}{$role}) eq 'HASH') { - if ($domconfig{'usermodification'}{$context}{$role}{$item}) { - $canmodify = 1; - last; - } - } - } - } - } - } elsif ($context eq 'course') { - if (grep(/^st$/,@userroles)) { - $canmodify = 1; - } - } - } + 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 $env{'form.c'.$item} =~ s/(\s+$|^\s+)//g; - if (!$canmodify) { + if (!$canmodify{$item}) { if (defined($env{'form.c'.$item})) { if ($env{'form.c'.$item} ne $userenv{$item}) { push(@mod_disallowed,$item); @@ -1752,7 +1760,6 @@ sub update_user_data { # Check to see if we can change the ID/student number my $forceid = $env{'form.forceid'}; my $recurseid = $env{'form.recurseid'}; - my $newuser = 0; my (%alerts,%rulematch,%idinst_results,%curr_rules,%got_rules); my %uidhash = &Apache::lonnet::idrget($env{'form.ccdomain'}, $env{'form.ccuname'}); @@ -1779,11 +1786,15 @@ sub update_user_data { } } } - my ($quotachanged,$namechanged,$oldportfolioquota,$newportfolioquota, + my ($quotachanged,$oldportfolioquota,$newportfolioquota, $inststatus,$oldisdefault,$newisdefault,$olddefquotatext, $newdefquotatext); my ($defquota,$settingstatus) = &Apache::loncommon::default_quota($env{'form.ccdomain'},$inststatus); + my $showquota; + if (&Apache::lonnet::allowed('mpq',$env{'form.ccdomain'})) { + $showquota = 1; + } my %changeHash; $changeHash{'portfolioquota'} = $userenv{'portfolioquota'}; if ($userenv{'portfolioquota'} ne '') { @@ -1854,6 +1865,13 @@ sub update_user_data { $changeHash{'firstname'},$changeHash{'middlename'}, $changeHash{'lastname'},$changeHash{'generation'}, $changeHash{'id'},undef,$changeHash{'permanentemail'}); + %userupdate = ( + lastname => $env{'form.clastname'}, + middlename => $env{'form.cmiddlename'}, + firstname => $env{'form.cfirstname'}, + generation => $env{'form.cgeneration'}, + id => $env{'form.cid'}, + ); } if (($namechanged && $namechgresult eq 'ok') || ($quotachanged && $quotachgresult eq 'ok')) { @@ -1881,8 +1899,11 @@ sub update_user_data { - END + if ($showquota) { + $r->print(" + \n"); + } $r->print(&Apache::loncommon::end_data_table_header_row(). &Apache::loncommon::start_data_table_row()); $r->print(<<"END"); @@ -1893,8 +1914,11 @@ END - END + if ($showquota) { + $r->print(" + \n"); + } $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::start_data_table_row()); $r->print(<<"END"); @@ -1905,8 +1929,11 @@ END - END + if ($showquota) { + $r->print(" + \n"); + } $r->print(&Apache::loncommon::end_data_table_row(). &Apache::loncommon::end_data_table().'
'); if ($env{'form.cid'} ne $userenv{'id'}) { @@ -1914,13 +1941,6 @@ END ($env{'form.ccuname'} => $env{'form.cid'})); if (($recurseid) && (&Apache::lonnet::allowed('mau',$env{'form.ccdomain'}))) { - my %userupdate = ( - lastname => $env{'form.clasaname'}, - middlename => $env{'form.cmiddlename'}, - firstname => $env{'form.cfirstname'}, - generation => $env{'fora.cgeneration'}, - id => $env{'form.cid'}, - ); my $idresult = &Apache::lonuserutils::propagate_id_change( $env{'form.ccuname'},$env{'form.ccdomain'}, @@ -1956,8 +1976,11 @@ END $r->print('
['.$lt{'mail'}.': '. $userenv{'permanentemail'}.']'); } - $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. - $olddefquotatext.']'); + if ($showquota) { + $r->print('
['.$lt{'disk'}.': '.$oldportfolioquota.' Mb '. + $olddefquotatext.']'); + } + $r->print(''); } if (@mod_disallowed) { my ($rolestr,$contextname); @@ -1988,9 +2011,31 @@ END $r->print($no_forceid_alert. &Apache::lonuserutils::print_namespacing_alerts($env{'form.ccdomain'},\%alerts, \%curr_rules)); } - ## + if ($env{'form.action'} eq 'singlestudent') { + &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser); + } else { + my $rolechanges = &update_roles($r); + if (!$rolechanges && $namechanged) { + if ($context eq 'course') { + if (@userroles > 0) { + if (grep(/^st$/,@userroles)) { + my $classlistupdated = + &Apache::lonuserutils::update_classlist($cdom, + $cnum,$env{'form.ccdomain'}, + $env{'form.ccuname'},\%userupdate); + } + } + } + } + } + $r->print(&Apache::loncommon::end_page()); +} + +sub update_roles { + my ($r) = @_; my $now=time; my $rolechanges = 0; + my %disallowed; $r->print('

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

'); foreach my $key (keys (%env)) { next if (! $env{$key}); @@ -2063,7 +2108,7 @@ END 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); - if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course')) { + if (($result =~ /^error/) || ($result eq 'not_in_class') || ($result eq 'unknown_course') || ($result eq 'refused')) { $output = "Error: $result\n"; } else { $output = &mt('Assigning').' '.$role.' in '.$url. @@ -2211,7 +2256,50 @@ END if (!$rolechanges) { $r->print(&mt('No roles to modify')); } - $r->print(&Apache::loncommon::end_page()); + return $rolechanges; +} + +sub enroll_single_student { + my ($r,$uhome,$amode,$genpwd,$now,$newuser) = @_; + $r->print('

'.&mt('Enrolling Student').'

'); + + # Remove non alphanumeric values from section + $env{'form.sections'}=~s/\W//g; + + # Clean out any old student roles the user has in this class. + &Apache::lonuserutils::modifystudent($env{'form.ccdomain'}, + $env{'form.ccuname'},$env{'request.course.id'},undef,$uhome); + my ($startdate,$enddate) = &Apache::lonuserutils::get_dates_from_form(); + my $enroll_result = + &Apache::lonnet::modify_student_enrollment($env{'form.ccdomain'}, + $env{'form.ccuname'},$env{'form.cid'},$env{'form.cfirstname'}, + $env{'form.cmiddlename'},$env{'form.clastname'}, + $env{'form.generation'},$env{'form.sections'},$enddate, + $startdate,'manual',undef,$env{'request.course.id'}); + if ($enroll_result =~ /^ok/) { + $r->print(&mt('[_1] enrolled',$env{'form.ccuname'}.':'.$env{'form.ccdomain'})); + if ($env{'form.sections'} ne '') { + $r->print(' '.&mt('in section [_1]',$env{'form.sections'})); + } + my ($showstart,$showend); + if ($startdate <= $now) { + $showstart = &mt('Access starts immediately'); + } else { + $showstart = &mt('Access starts: ').&Apache::lonlocal::locallocaltime($startdate); + } + if ($enddate == 0) { + $showend = &mt('ends: no ending date'); + } else { + $showend = &mt('ends: ').&Apache::lonlocal::locallocaltime($enddate); + } + $r->print('.
'.$showstart.'; '.$showend); + if ($startdate <= $now && !$newuser) { + $r->print("

".&mt('If the student is currently logged-in to LON-CAPA, the new role will be available when the student next logs in.')."

"); + } + } else { + $r->print(&mt('unable to enroll').": ".$enroll_result); + } + return; } sub get_defaultquota_text { @@ -2251,7 +2339,7 @@ sub update_result_form { } $outcome .= ''."\n". ''."\n". - ''."\n". + ''."\n". ''; return $outcome; } @@ -2642,31 +2730,18 @@ sub handler { if (! exists($env{'form.state'})) { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } elsif ($env{'form.state'} eq 'got_file') { - &Apache::lonuserutils::print_upload_manager_form($r,$context); + &Apache::lonuserutils::print_upload_manager_form($r,$context, + $permission); } elsif ($env{'form.state'} eq 'enrolling') { if ($env{'form.datatoken'}) { - &Apache::lonuserutils::upfile_drop_add($r,$context); + &Apache::lonuserutils::upfile_drop_add($r,$context,$permission); } } else { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } $r->print(''.&Apache::loncommon::end_page()); - } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) { - $r->print(&header()); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=expire', - text=>"Expire User Roles"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles', - 'User_Management_Drops')); - if (! exists($env{'form.state'})) { - &Apache::lonuserutils::print_expire_menu($r,$context); - } elsif ($env{'form.state'} eq 'done') { - &Apache::lonuserutils::expire_user_list($r,$context); - } else { - &Apache::lonuserutils::print_expire_menu($r,$context); - } - $r->print(&Apache::loncommon::end_page()); - } elsif ($env{'form.action'} eq 'singleuser' && $permission->{'cusr'}) { + } elsif ((($env{'form.action'} eq 'singleuser') || ($env{'form.action'} + eq 'singlestudent')) && ($permission->{'cusr'})) { my $phase = $env{'form.phase'}; my @search = ('srchterm','srchby','srchin','srchtype','srchdomain'); &Apache::loncreateuser::restore_prev_selections(); @@ -2681,22 +2756,30 @@ sub handler { my $response; if ($env{'form.srchterm'} !~ /^$match_username$/) { 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); } 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); + $srch,$response,$context, + $permission); } } elsif ($env{'form.phase'} eq 'get_user_info') { my ($currstate,$response,$forcenewuser,$results) = - &user_search_result($srch); + &user_search_result($context,$srch); if ($env{'form.currstate'} eq 'modify') { $currstate = $env{'form.currstate'}; } if ($currstate eq 'select') { + my $operation; + if ($env{'form.action'} eq 'singleuser') { + $operation = 'createuser'; + } elsif ($env{'form.action'} eq 'singlestudent') { + $operation = 'enrollstudent'; + } &print_user_selection_page($r,$response,$srch,$results, - 'createuser',\@search,$context); + $operation,\@search,$context); } elsif ($currstate eq 'modify') { my ($ccuname,$ccdomain); if (($srch->{'srchby'} eq 'uname') && @@ -2713,7 +2796,8 @@ sub handler { $response = ''; } &print_user_modification_page($r,$ccuname,$ccdomain, - $srch,$response,$context); + $srch,$response,$context, + $permission); } elsif ($currstate eq 'query') { &print_user_query_page($r,'createuser'); } else { @@ -2724,7 +2808,7 @@ 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); + $context,$permission); } } elsif ($env{'form.phase'} eq 'update_user_data') { &update_user_data($r,$context); @@ -2741,15 +2825,22 @@ sub handler { ($permission->{'view'} || $permission->{'cusr'})) { if ($env{'form.phase'} eq 'bulkchange') { &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'backPage(document.studentform)', - text=>"List Users"}); + ({href=>'/adm/createuser?action=listusers', + text=>"List Users"}, + {href=>"/adm/createuser", + text=>"Result"}); my $setting = $env{'form.roletype'}; my $choice = $env{'form.bulkaction'}; $r->print(&header()); - $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users", + $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users", 'User_Management_List')); if ($permission->{'cusr'}) { &Apache::lonuserutils::update_user_list($r,$context,$setting,$choice); + $r->print('

'.&mt('Display User Lists').''); + $r->print(&Apache::loncommon::end_page()); + } else { + $r->print(&mt('You are not authorized to make bulk changes to user roles')); + $r->print(&Apache::loncommon::end_page()); } } else { &Apache::lonhtmlcommon::add_breadcrumb @@ -2779,25 +2870,31 @@ sub handler { $formname,$totcodes,$codetitles,$idlist,$idlist_titles); $r->print(&Apache::loncommon::end_page()); } - } elsif ($env{'form.action'} eq 'expire' && $permission->{'cusr'}) { + } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) { $r->print(&header()); &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/createuser?action=drop', - text=>"Expire Users"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Expire User Roles', - 'User_Management_Drops')); - if (! exists($env{'form.state'})) { - &Apache::lonuserutils::print_expire_menu($r,$context); + text=>"Drop Students"}); + if (!exists($env{'form.state'})) { + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', + 'Course_Drop_Student')); + + &Apache::lonuserutils::print_drop_menu($r,$context,$permission); } elsif ($env{'form.state'} eq 'done') { - &Apache::lonuserutiles::expire_user_list($r,$context); - } else { - &print_expire_menu($r,$context); + &Apache::lonhtmlcommon::add_breadcrumb + ({href=>'/adm/createuser?action=drop', + text=>"Result"}); + $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', + 'Course_Drop_Student')); + &Apache::lonuserutils::update_user_list($r,$context,undef, + $env{'form.action'}); } $r->print(&Apache::loncommon::end_page()); } elsif ($env{'form.action'} eq 'dateselect') { if ($permission->{'cusr'}) { $r->print(&header(undef,undef,{'no_nav_bar' => 1}). - &Apache::lonuserutils::date_section_selector($context). + &Apache::lonuserutils::date_section_selector($context, + $permission). &Apache::loncommon::end_page()); } else { $r->print(&header(). @@ -2851,17 +2948,17 @@ sub print_main_menu { my %links = ( domain => { upload => 'Upload a File of Users', - singleuser => 'Add/Manage a Single User', + singleuser => 'Add/Modify a Single User', listusers => 'Manage Multiple Users', }, author => { upload => 'Upload a File of Co-authors', - singleuser => 'Add/Manage a Single Co-author', + singleuser => 'Add/Modify a Single Co-author', listusers => 'Display Co-authors and Manage Multiple Users', }, course => { upload => 'Upload a File of Course Users', - singleuser => 'Add/Manage a Single Course User', + singleuser => 'Add/Modify a Single Course User', listusers => 'Display Class Lists and Manage Multiple Users', }, ); @@ -2892,21 +2989,33 @@ sub print_main_menu { push(@menu,$customlink); } if ($context eq 'course') { - my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; - my @courselinks = + my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); + my @courselinks = ( - { text => 'Automated Enrollment Manager', + { text => 'Enroll a Single Student', + help => 'Course_Single_Student', + action => 'singlestudent', + permission => $permission->{'cusr'}, + }, + { text => 'Drop Students', + help => 'Course_Drop_Student', + action => 'drop', + permission => $permission->{'cusr'}, + }); + if (!exists($permission->{'cusr_section'})) { + push(@courselinks, + { text => 'Automated Student Enrollment Manager', permission => (&Apache::lonnet::auto_run($cnum,$cdom) && $permission->{'cusr'}), url => '/adm/populate', - }, + }); + } + push(@courselinks, { text => 'Manage Course Groups', help => 'Course_Manage_Group', permission => $permission->{'grp_manage'}, url => '/adm/coursegroups?refpage=cusr', - }, - ); + }); push(@menu,@courselinks); } my $menu_html = ''; @@ -2943,7 +3052,7 @@ sub restore_prev_selections { #-------------------------------------------------- functions for &phase_two sub user_search_result { - my ($srch) = @_; + my ($context,$srch) = @_; my %allhomes; my %inst_matches; my %srch_results; @@ -3012,14 +3121,14 @@ sub user_search_result { my $uhome=&Apache::lonnet::homeserver($srch->{'srchterm'},$srch->{'srchdomain'}); if ($uhome eq 'no_host') { ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } else { $currstate = 'modify'; } } else { %srch_results = &Apache::lonnet::usersearch($srch); ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } } else { my $courseusers = &get_courseusers(); @@ -3028,7 +3137,7 @@ sub user_search_result { $currstate = 'modify'; } else { ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } } else { foreach my $user (keys(%$courseusers)) { @@ -3055,7 +3164,7 @@ sub user_search_result { } } ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } } } @@ -3065,7 +3174,7 @@ sub user_search_result { ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch); if ($dirsrchres eq 'ok') { ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } else { my $showdom = &display_domain_info($srch->{'srchdomain'}); $response = ''. @@ -3079,7 +3188,7 @@ sub user_search_result { if ($srch->{'srchin'} eq 'dom') { %srch_results = &Apache::lonnet::usersearch($srch); ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } elsif ($srch->{'srchin'} eq 'crs') { my $courseusers = &get_courseusers(); foreach my $user (keys(%$courseusers)) { @@ -3131,14 +3240,14 @@ sub user_search_result { } } ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } elsif ($srch->{'srchin'} eq 'alc') { $currstate = 'query'; } elsif ($srch->{'srchin'} eq 'instd') { ($dirsrchres,%srch_results) = &Apache::lonnet::inst_directory_query($srch); if ($dirsrchres eq 'ok') { ($currstate,$response,$forcenewuser) = - &build_search_response($srch,%srch_results); + &build_search_response($context,$srch,%srch_results); } else { my $showdom = &display_domain_info($srch->{'srchdomain'}); $response = ''. &mt('Institutional directory search is not available in domain: [_1]',$showdom). @@ -3244,7 +3353,7 @@ sub get_courseusers { } sub build_search_response { - my ($srch,%srch_results) = @_; + my ($context,$srch,%srch_results) = @_; my ($currstate,$response,$forcenewuser); my %names = ( 'uname' => 'username', @@ -3303,8 +3412,15 @@ sub build_search_response { } } if (!($srch->{'srchby'} eq 'uname' && $srch->{'srchin'} eq 'dom' && $srch->{'srchtype'} eq 'exact' && $srch->{'srchdomain'} eq $env{'request.role.domain'})) { - my $showdom = &display_domain_info($env{'request.role.domain'}); + my $cancreate = + &Apache::lonuserutils::can_create_user($env{'request.role.domain'},$context); + if ($cancreate) { + my $showdom = &display_domain_info($env{'request.role.domain'}); $response .= '

'.&mt("To add a new user (you can only create new users in your current role's domain - [_1]):",$env{'request.role.domain'}).'


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

'.&mt("You are not authorized to create new users in your current role's domain - [_1].",$env{'request.role.domain'}).'
'.&mt('Contact the helpdesk if you need to create a new user.',$helplink).'

'; + } } } } @@ -3351,8 +3467,18 @@ sub crumb_utilities { my $jsback .= qq| function backPage(formname,prevphase,prevstate) { - formname.phase.value = prevphase; - formname.currstate.value = prevstate; + if (typeof prevphase == 'undefined') { + formname.phase.value = ''; + } + else { + formname.phase.value = prevphase; + } + if (typeof prevstate == 'undefined') { + formname.currstate.value = ''; + } + else { + formname.currstate.value = prevstate; + } formname.submit(); } |; @@ -3394,84 +3520,26 @@ sub course_level_table { &Apache::loncommon::get_sections($domain,$cnum); } } - foreach my $role ('st','ta','ep','in','cc') { + my @roles = &Apache::lonuserutils::roles_by_context('course'); + foreach my $role (@roles) { + my $plrole=&Apache::lonnet::plaintext($role); if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) { - my $plrole=&Apache::lonnet::plaintext($role); - $table .= &Apache::loncommon::start_data_table_row(). -'
- -'."\n"; - if ($role ne 'cc') { - if (%sections_count) { - my $currsec = - &Apache::lonuserutils::course_sections(\%sections_count, - $protectedcourse.'_'.$role); - $table .= - ''; - } else { - $table .= ''; - } - } else { - $table .= ''; + $table .= &course_level_row($protectedcourse,$role,$area,$domain, + $plrole,\%sections_count,\%lt); + } 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); } - $table .= < -$lt{'ssd'} - -ENDTIMEENTRY - $table.= &Apache::loncommon::end_data_table_row(); } } - foreach my $cust (sort keys %customroles) { - if (&Apache::lonnet::allowed('ccr',$thiscourse)) { - my $plrole=$cust; - my $customrole=$protectedcourse.'_cr_cr_'.$env{'user.domain'}. - '_'.$env{'user.name'}.'_'.$plrole; - $table .= &Apache::loncommon::start_data_table_row(). -' - -'."\n"; - if (%sections_count) { - my $currsec = - &Apache::lonuserutils::course_sections(\%sections_count, - $customrole); - $table.= - ''; - } else { - $table .= ''; - } - $table .= < -$lt{'ssd'} - -ENDENTRY - $table .= &Apache::loncommon::end_data_table_row(); - } + if (&Apache::lonnet::allowed('ccr',$thiscourse)) { + foreach my $cust (sort keys %customroles) { + my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust; + $table .= &course_level_row($protectedcourse,$role,$area,$domain, + $cust,\%sections_count,\%lt); + } } } return '' if ($table eq ''); # return nothing if there is nothing @@ -3491,9 +3559,56 @@ $table. return $result; } +sub course_level_row { + my ($protectedcourse,$role,$area,$domain,$plrole,$sections_count,$lt) = @_; + my $table = &Apache::loncommon::start_data_table_row(). + ' '."\n". + ' '."\n". + ''."\n"; + if ($role eq 'cc') { + $table .= ''; + } elsif ($env{'request.course.sec'} ne '') { + $table .= ' '; + } else { + if (ref($sections_count) eq 'HASH') { + my $currsec = + &Apache::lonuserutils::course_sections($sections_count, + $protectedcourse.'_'.$role); + $table .= ''; + } else { + $table .= ''; + } + } + $table .= < +$lt->{'ssd'} + +ENDTIMEENTRY + $table.= &Apache::loncommon::end_data_table_row(); +} + sub course_level_dc { my ($dcdom) = @_; my %customroles=&Apache::lonuserutils::my_custom_roles(); + my @roles = &Apache::lonuserutils::roles_by_context('course'); my $hiddenitems = ''. ''. ''; @@ -3518,7 +3633,7 @@ sub course_level_dc { my $otheritems = &Apache::loncommon::start_data_table_row()."\n". ''."\n". ''. ''. '
$lt{'usr'}:
'; - my $active=1; - $active=0 if (($role_end_time) && ($now>$role_end_time)); - if (($active) && ($allowed)) { - $row.= ''; - } else { - if ($active) { - $row.=' '; - } else { - $row.=&mt('expired or revoked'); - } - } - $row.=''; - if ($allowed && !$active) { - $row.= ''; - } else { - $row.=' '; - } - $row.=''; - if ($delallowed) { - $row.= ''; - } else { + $allowed=1; + } + if (((&Apache::lonnet::allowed('dro',$1)) || + (&Apache::lonnet::allowed('dro',$ccdomain))) && + ($role_code ne 'dc')) { + $delallowed=1; + } + } else { + if (&Apache::lonnet::allowed('c'.$role_code,'/')) { + $allowed=1; + } + } + if ($role_code eq 'ca' || $role_code eq 'au') { + $class='Construction Space'; + } elsif ($role_code eq 'su') { + $class='System'; + } else { + $class='Domain'; + } + } + if (($role_code eq 'ca') || ($role_code eq 'aa')) { + $area=~m{/($match_domain)/($match_username)}; + if (&Apache::lonuserutils::authorpriv($2,$1)) { + $allowed=1; + } else { + $allowed=0; + } + } + my $row = ''; + $row.= ''; + my $active=1; + $active=0 if (($role_end_time) && ($now>$role_end_time)); + if (($active) && ($allowed)) { + $row.= ''; + } else { + if ($active) { $row.=' '; - } - my $plaintext=''; - if (!$croletitle) { - $plaintext=&Apache::lonnet::plaintext($role_code,$class) - } else { - $plaintext= - "Customrole '$croletitle'
defined by $croleuname\@$croleudom"; - } - $row.= '
'.$plaintext. - ''.$area. - ''.($role_start_time?localtime($role_start_time) - : ' ' ). - ''.($role_end_time ?localtime($role_end_time) - : ' ' ) - ."
".&mt($type)."
'; + if ($allowed && !$active) { + $row.= ''; + } else { + $row.=' '; + } + $row.=''; + if ($delallowed) { + $row.= ''; + } else { + $row.=' '; + } + my $plaintext=''; + if (!$croletitle) { + $plaintext=&Apache::lonnet::plaintext($role_code,$class) + } else { + $plaintext= + "Customrole '$croletitle'
defined by $croleuname\@$croleudom"; + } + $row.= '
'.$plaintext. + ''.$area. + ''.($role_start_time?localtime($role_start_time) + : ' ' ). + ''.($role_end_time ?localtime($role_end_time) + : ' ' ) + ."
".&mt($type)."
'.$lt{'rol'}.''.$lt{'ext'}. ''.$lt{'sta'}.''.$lt{'end'}.''.$lt{'act'}.''.$lt{'rol'}.''.$lt{'ext'}.''.$lt{'sta'}.''.$lt{'end'}.' + ); + $r->print('

'.$lt{'cs'}.'

'."\n". + &Apache::loncommon::start_data_table()."\n". + &Apache::loncommon::start_data_table_header_row()."\n". + '
'.$lt{'act'}.''.$lt{'rol'}.''.$lt{'ext'}.''.$lt{'sta'}.''.$lt{'end'}.' '.$lt{'cau'}.' '.$lt{'sed'}.' '.$lt{'caa'}.' '.$cudom.'_'.$cuname.' '.$lt{'sed'}.' '.$plrole.'$lt{'gen'} $lt{'id'} $lt{'mail'}$lt{'disk'}$lt{'disk'}$userenv{'generation'} $userenv{'id'} $userenv{'permanentemail'} $oldportfolioquota Mb $olddefquotatext $oldportfolioquota Mb $olddefquotatext $env{'form.cgeneration'} $env{'form.cid'} $env{'form.cpermanentemail'} $newportfolioquota Mb $newdefquotatext $newportfolioquota Mb $newdefquotatext '.$plrole.''.$area.'
Domain: '.$domain.'
'. - ' - '. - ''. - ''. - '
'.$lt{'exs'}.'
'. - $currsec.'
   '.$lt{'new'}.'
'. - ''. - '
  -$lt{'sed'}'.$plrole.''.$area.''. - ''. - ''. - ''. - ''. - '
'. - $lt{'exs'}.'
'.$currsec.'
   '.$lt{'new'}.'
'. - '
-$lt{'sed'}'.$plrole.''.$area.'
Domain: '.$domain.'
 '. + $env{'request.course.sec'}.''. + ' + + + '."\n". + '
'.$lt->{'exs'}.'
'. + $currsec.'
   '.$lt->{'new'}.'
'. + ''. + '
+$lt->{'sed'}   '.$lt{'new'}.'
'. ''. + ''. '
'; $otheritems .= <