--- loncom/interface/loncreateuser.pm 2010/01/20 14:35:36 1.295.2.28 +++ loncom/interface/loncreateuser.pm 2010/08/09 23:39:43 1.329.2.3 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.295.2.28 2010/01/20 14:35:36 raeburn Exp $ +# $Id: loncreateuser.pm,v 1.329.2.3 2010/08/09 23:39:43 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -219,7 +219,7 @@ END_SCRIPT sub build_tools_display { my ($ccuname,$ccdomain,$context) = @_; my (@usertools,%userenv,$output,@options,%validations,%reqtitles,%reqdisplay, - $colspan,$isadv,%domconfig); + $colspan); my %lt = &Apache::lonlocal::texthash ( 'blog' => "Personal User Blog", 'aboutme' => "Personal Information Page", @@ -231,19 +231,18 @@ sub build_tools_display { 'uscu' => "Use custom", 'official' => 'Can request creation of official courses', 'unofficial' => 'Can request creation of unofficial courses', + 'community' => 'Can request creation of communities', ); if ($context eq 'requestcourses') { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, - 'requestcourses.official','requestcourses.unofficial'); - @usertools = ('official','unofficial'); + 'requestcourses.official','requestcourses.unofficial', + 'requestcourses.community'); + @usertools = ('official','unofficial','community'); @options =('norequest','approval','autolimit','validate'); %validations = &Apache::lonnet::auto_courserequest_checks($ccdomain); %reqtitles = &courserequest_titles(); %reqdisplay = &courserequest_display(); $colspan = ' colspan="2"'; - %domconfig = - &Apache::lonnet::get_dom('configuration',['requestcourses'],$ccdomain); - $isadv = &Apache::lonnet::is_advanced_user($ccuname,$ccdomain); } else { %userenv = &Apache::lonnet::userenvironment($ccdomain,$ccuname, 'tools.aboutme','tools.portfolio','tools.blog'); @@ -290,14 +289,7 @@ sub build_tools_display { &Apache::loncommon::start_data_table_row()."\n"; if ($context eq 'requestcourses') { my ($curroption,$currlimit); - if ($userenv{$context.'.'.$item} ne '') { - $curroption = $userenv{$context.'.'.$item}; - } else { - my (@inststatuses); - $curroption = - &Apache::loncoursequeueadmin::get_processtype($ccuname,$ccdomain,$isadv,$ccdomain, - $item,\@inststatuses,\%domconfig); - } + $curroption = $userenv{$context.'.'.$item}; if (!$curroption) { $curroption = 'norequest'; } @@ -505,8 +497,14 @@ sub print_username_entry_form { 'onload' => "javascript:setFormElements(document.$formtoset)", ); my %breadcrumb_text = &singleuser_breadcrumb($crstype); + my $title = 'User Management'; + if ($context eq 'course') { + if (&Apache::loncommon::needs_gci_custom()) { + $title = 'Enrollment and Student Activity'; + } + } my $start_page = - &Apache::loncommon::start_page('User Management', + &Apache::loncommon::start_page($title, $jscript,{'add_entries' => \%loaditems,}); if ($env{'form.action'} eq 'custom') { &Apache::lonhtmlcommon::add_breadcrumb @@ -524,12 +522,11 @@ sub print_username_entry_form { } elsif ($env{'form.action'} eq 'singlestudent') { $helpitem = 'Course_Add_Student'; } - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management', + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs($title, $helpitem); my %lt=&Apache::lonlocal::texthash( 'srst' => 'Search for a user and enroll as a student', 'srme' => 'Search for a user and enroll as a member', - 'srad' => 'Search for a user and modify/add user information or roles', 'usr' => "Username", 'dom' => "Domain", @@ -684,7 +681,7 @@ ENDBLOCK ); my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain'); my ($title,$buttontext,$showresponse); - if ($env{'form.action'} eq 'singlestudent') { + if ($env{'form.action'} eq 'singlestudent') { if ($crstype eq 'Community') { $title = $lt{'enrm'}; } else { @@ -801,7 +798,13 @@ ENDSCRIPT if ($context eq 'requestcrs') { $r->print('
'); } else { - $r->print(&Apache::loncommon::start_page('User Management',$jscript)); + my $title = 'User Management'; + if ($context eq 'course') { + if (&Apache::loncommon::needs_gci_custom()) { + $title = 'Enrollment and Student Activity'; + } + } + $r->print(&Apache::loncommon::start_page($title,$jscript)); my %breadcrumb_text = &singleuser_breadcrumb($crstype); &Apache::lonhtmlcommon::add_breadcrumb @@ -812,13 +815,13 @@ ENDSCRIPT text=>$breadcrumb_text{'userpicked'}, faq=>282,bug=>'Instructor Interface',}); if ($env{'form.action'} eq 'singleuser') { - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + $r->print(&Apache::lonhtmlcommon::breadcrumbs($title, 'Course_Change_Privileges')); $r->print("$lt{'usrch'}
"); $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype)); $r->print('

'.$lt{'usel'}.'

'); } elsif ($env{'form.action'} eq 'singlestudent') { - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + $r->print(&Apache::lonhtmlcommon::breadcrumbs($title, 'Course_Add_Student')); $r->print($jscript.""); if ($crstype eq 'Community') { @@ -1003,8 +1006,14 @@ sub print_user_modification_page { if ($env{'form.popup'}) { $args->{'no_nav_bar'} = 1; } + my $title = 'User Management'; + if ($context eq 'course') { + if (&Apache::loncommon::needs_gci_custom()) { + $title = 'Enrollment and Student Activity'; + } + } my $start_page = - &Apache::loncommon::start_page('User Management',$js,$args); + &Apache::loncommon::start_page($title,$js,$args); my %breadcrumb_text = &singleuser_breadcrumb($crstype); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage($form)", @@ -1025,7 +1034,7 @@ sub print_user_modification_page { if ($env{'form.action'} eq 'singlestudent') { $helpitem = 'Course_Add_Student'; } - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management', + my $crumbs = &Apache::lonhtmlcommon::breadcrumbs($title, $helpitem); my $forminfo =<<"ENDFORMINFO"; @@ -1052,8 +1061,8 @@ ENDFORMINFO } } else { foreach my $key (keys(%env)) { - if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) { - $inccourses{$1.'_'.$2}=1; + if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) { + $inccourses{$1.'_'.$2}=1; } } } @@ -1427,7 +1436,7 @@ sub display_existing_roles { my (%rolesdump,%roletext,%sortrole,%roleclass,%rolepriv); if ($context eq 'course' || $context eq 'author') { my @roles = &Apache::lonuserutils::roles_by_context($context,1,$crstype); - my %roleshash = + my %roleshash = &Apache::lonnet::get_my_roles($ccuname,$ccdomain,'userroles', ['active','previous','future'],\@roles,$roledom,1); foreach my $key (keys(%roleshash)) { @@ -1496,9 +1505,8 @@ sub display_existing_roles { if (defined($coursedata{'description'})) { $carea=$coursedata{'description'}. '
'.&mt('Domain').': '.$coursedom.(' 'x8). - &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom); + &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom); $sortkey.="\0".$coursedata{'description'}; - $class=$coursedata{'type'}; } else { if ($class eq 'Community') { $carea=&mt('Unavailable community').': '.$area; @@ -1523,10 +1531,10 @@ sub display_existing_roles { $allowed = 1; } } - } + } if ((&Apache::lonnet::allowed('dro',$coursedom)) || (&Apache::lonnet::allowed('dro',$ccdomain))) { - $delallowed=1; + $delallowed=1; } # - custom role. Needs more info, too if ($croletitle) { @@ -1539,11 +1547,11 @@ sub display_existing_roles { $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; - } - } + if ($env{'request.course.sec'} eq $3) { + if (&Apache::lonnet::allowed('c'.$role_code,$1.'/'.$2.'/'.$3)) { + $allowed = 1; + } + } } } $area=$carea; @@ -1552,8 +1560,8 @@ sub display_existing_roles { # 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; + (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { + $allowed=1; } if (((&Apache::lonnet::allowed('dro',$1)) || (&Apache::lonnet::allowed('dro',$ccdomain))) && @@ -1617,7 +1625,7 @@ sub display_existing_roles { ''.$area. ''.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time) : ' ' ). - ''.($role_end_time ?&Apache::lonlocal::locallocaltime($role_end_time) + ''.($role_end_time ?&Apache::lonlocal::locallocaltime($role_end_time) : ' ' ) .""; $sortrole{$sortkey}=$envkey; @@ -1625,13 +1633,14 @@ sub display_existing_roles { $roleclass{$envkey}=$class; $rolepriv{$envkey}=$allowed; } # end of foreach (table building loop) + my $rolesdisplay = 0; my %output = (); foreach my $type ('Construction Space','Course','Community','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}.= + $output{$type}.= &Apache::loncommon::start_data_table_row(). $roletext{$sortrole{$which}}. &Apache::loncommon::end_data_table_row(); @@ -1653,13 +1662,13 @@ sub display_existing_roles { $contextrole = &mt('Existing Roles in this Course'); } } elsif ($env{'request.role'} =~ /^au\./) { - $contextrole = 'Existing Co-Author Roles in your Construction Space'; + $contextrole = &mt('Existing Co-Author Roles in your Construction Space'); } else { - $contextrole = 'Existing Roles in this Domain'; + $contextrole = &mt('Existing Roles in this Domain'); } $r->print('

'.$lt{'rer'}.'

'. -'
'.&mt($contextrole).'
'. +'
'.$contextrole.'
'. &Apache::loncommon::start_data_table("LC_createuser"). &Apache::loncommon::start_data_table_header_row(). ''.$lt{'rev'}.''.$lt{'ren'}.''.$lt{'del'}. @@ -2213,7 +2222,13 @@ sub update_user_data { if ($env{'form.action'} eq 'singlestudent') { $helpitem = 'Course_Add_Student'; } - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + my $title = 'User Management'; + if ($context eq 'course') { + if (&Apache::loncommon::needs_gci_custom()) { + $title = 'Enrollment and Student Activity'; + } + } + $r->print(&Apache::lonhtmlcommon::breadcrumbs($title, $helpitem)); $r->print(&update_result_form($uhome)); # Check Inputs @@ -2283,7 +2298,7 @@ sub update_user_data { $env{'form.ccuname'}, $env{'form.ccdomain'}).''); my (%alerts,%rulematch,%inst_results,%curr_rules); my @usertools = ('aboutme','blog','portfolio'); - my @requestcourses = ('official','unofficial'); + my @requestcourses = ('official','unofficial','community'); my ($othertitle,$usertypes,$types) = &Apache::loncommon::sorted_inst_types($env{'form.ccdomain'}); if ($env{'form.makeuser'}) { @@ -2684,11 +2699,13 @@ sub update_user_data { ($env{'user.domain'} eq $env{'form.ccdomain'})) { my %newenvhash; foreach my $key (keys(%changed)) { - if (($key eq 'official') || ($key eq 'unofficial')) { + if (($key eq 'official') || ($key eq 'unofficial') + || ($key eq 'community')) { $newenvhash{'environment.requestcourses.'.$key} = $changeHash{'requestcourses.'.$key}; if ($changeHash{'requestcourses.'.$key} ne '') { - $newenvhash{'environment.canrequest.'.$key} = 1; + $newenvhash{'environment.canrequest.'.$key} = + $changeHash{'requestcourses.'.$key}; } else { $newenvhash{'environment.canrequest.'.$key} = &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'}, @@ -2745,6 +2762,7 @@ sub update_user_data { '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:' @@ -2898,6 +2916,7 @@ END 'portfolio' => "Portfolio Availability", 'official' => "Can Request Official Courses", 'unofficial' => "Can Request Unofficial Courses", + 'community' => "Can Request Communities", 'inststatus' => "Affiliation", ); $r->print(<<"END"); @@ -3489,8 +3508,8 @@ sub enroll_single_student { $r->print(&mt('If the member is currently logged-in to LON-CAPA, the new role will be available when the member next logs in.')); } else { $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.')); - } - $r->print('

'); + } + $r->print('

'); } } else { $r->print(&mt('unable to enroll').": ".$enroll_result); @@ -3616,7 +3635,7 @@ sub build_roles { sub custom_role_editor { my ($r) = @_; my $action = $env{'form.customroleaction'}; - my $rolename; + my $rolename; if ($action eq 'new') { $rolename=$env{'form.newrolename'}; } else { @@ -3636,6 +3655,12 @@ sub custom_role_editor { $context = 'domain'; $crstype = $env{'form.templatecrstype'}; } + my $title = 'User Management'; + if ($context eq 'course') { + if (&Apache::loncommon::needs_gci_custom()) { + $title = 'Enrollment and Student Activity'; + } + } # ------------------------------------------------------- What can be assigned? my %full=(); my %courselevel=(); @@ -3653,7 +3678,7 @@ sub custom_role_editor { # ------------------------------------------------- Get current role privileges ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef); if ($crstype eq 'Community') { - $syspriv =~ s/bre\&S//; + $syspriv =~ s/bre\&S//; } } else { $body_top .= &mt('New Role').' "'; @@ -3694,8 +3719,8 @@ sub custom_role_editor { my ($jsback,$elements) = &crumb_utilities(); my $button_code = "\n"; my $head_script = "\n"; - $head_script .= ''."\n"; + + $head_script .= "\n".$jsback."\n" + .'// ]]>'."\n" + .''."\n"; $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script)); - &Apache::lonhtmlcommon::add_breadcrumb + &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.form1,'pickrole','')", text=>"Pick custom role", faq=>282,bug=>'Instructor Interface',}, {href=>"javascript:backPage(document.form1,'','')", text=>"Edit custom role", faq=>282,bug=>'Instructor Interface',}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + $r->print(&Apache::lonhtmlcommon::breadcrumbs($title, 'Course_Editing_Custom_Roles')); $r->print($body_top); @@ -3760,6 +3786,7 @@ sub custom_role_editor { 'dml' => "Domain Level", 'ssl' => "System Level"); + $r->print('
' .'
' .''.&mt('Select a Template').'' @@ -3786,7 +3813,7 @@ ENDCCF ''.$lt{'prv'}.''.$lt{'crl'}.''.$lt{'dml'}. ''.$lt{'ssl'}.''. &Apache::loncommon::end_data_table_header_row()); - foreach my $priv (sort keys %full) { + foreach my $priv (sort(keys(%full))) { my $privtext = &Apache::lonnet::plaintext($priv,$crstype); $r->print(&Apache::loncommon::start_data_table_row(). ''.$privtext.''. @@ -3797,7 +3824,7 @@ ENDCCF ($domainlevelcurrent{$priv}?' checked="checked"':'').' />':' '). ''); if ($priv eq 'bre' && $crstype eq 'Community') { - $r->print(' '); + $r->print(' '); } else { $r->print($systemlevel{$priv}?'':' '); @@ -3897,12 +3924,17 @@ sub set_custom_role { return; } my ($jsback,$elements) = &crumb_utilities(); - my $jscript = ''; - + my $jscript = ''."\n"; + my $title = 'User Management'; + if ($context eq 'course') { + if (&Apache::loncommon::needs_gci_custom()) { + $title = 'Enrollment and Student Activity'; + } + } $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript); &Apache::lonhtmlcommon::add_breadcrumb ({href=>"javascript:backPage(document.customresult,'pickrole','')", @@ -3914,7 +3946,7 @@ sub set_custom_role { {href=>"javascript:backPage(document.customresult,'set_custom_roles','')", text=>"Result", faq=>282,bug=>'Instructor Interface',}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', + $r->print(&Apache::lonhtmlcommon::breadcrumbs($title, 'Course_Editing_Custom_Roles')); my ($rdummy,$roledef)= @@ -3992,6 +4024,12 @@ sub handler { } else { $context = 'domain'; } + my $title = 'User Management'; + if ($context eq 'course') { + if (&Apache::loncommon::needs_gci_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']); @@ -3999,7 +4037,7 @@ sub handler { if ($env{'form.action'} ne 'dateselect') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>"/adm/createuser", - text=>"User Management", + text=>$title, 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 @@ -4019,7 +4057,7 @@ sub handler { # Main switch on form.action and form.state, as appropriate if (! exists($env{'form.action'})) { $r->print(&header()); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs($title)); $r->print(&print_main_menu($permission,$context,$crstype)); $r->print(&Apache::loncommon::end_page()); } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) { @@ -4150,11 +4188,11 @@ sub handler { if (($context eq 'domain') && (($env{'form.roletype'} eq 'course') || ($env{'form.roletype'} eq 'community'))) { if ($env{'form.roletype'} eq 'course') { - ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) = + ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) = &Apache::lonuserutils::courses_selector($env{'request.role.domain'}, $formname); } elsif ($env{'form.roletype'} eq 'community') { - $cb_jscript = + $cb_jscript = &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'}); my %elements = ( coursepick => 'radio', @@ -4193,7 +4231,7 @@ sub handler { ({href=>'/adm/createuser?action=drop', text=>$brtext}); if (!exists($env{'form.state'})) { - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', + $r->print(&Apache::lonhtmlcommon::breadcrumbs($brtext, 'Course_Drop_Student')); &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype); @@ -4253,7 +4291,6 @@ sub handler { $r->print('

'.&mt('Pending enrollment requests').'

'."\n"); $r->print(&Apache::loncoursequeueadmin::display_queued_requests($context, $cdom,$cnum)); - } elsif ($env{'form.state'} eq 'done') { &Apache::lonhtmlcommon::add_breadcrumb ({href=>'/adm/createuser?action=selfenrollqueue', @@ -4276,7 +4313,7 @@ sub handler { $r->print(&Apache::loncommon::end_page()); } else { $r->print(&header()); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); + $r->print(&Apache::lonhtmlcommon::breadcrumbs($title)); $r->print(&print_main_menu($permission,$context,$crstype)); $r->print(&Apache::loncommon::end_page()); } @@ -4296,11 +4333,11 @@ sub header { sub add_script { my ($js) = @_; - return ''."\n"; + return ''."\n"; } sub verify_user_display { @@ -4322,136 +4359,304 @@ END # Menu Phase One sub print_main_menu { my ($permission,$context,$crstype) = @_; + if (($context eq 'course') && (&Apache::loncommon::needs_gci_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')) { $linkcontext = lc($crstype); $stuterm = 'Members'; } - my %links = ( - domain => { - upload => 'Upload a File of Users', - singleuser => 'Add/Modify a Single User', - listusers => 'Manage Multiple Users', - }, - author => { - upload => 'Upload a File of Co-authors', - 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/Modify a Single Course User', - listusers => 'Display Class Lists and Manage Multiple Users', - }, - community => { - upload => 'Upload a File of Community Users', - singleuser => 'Add/Modify a Community User', - listusers => 'Manage Community Users', - }, + domain => { + upload => 'Upload a File of Users', + singleuser => 'Add/Modify a User', + listusers => 'Manage Users', + }, + author => { + upload => 'Upload a File of Co-authors', + singleuser => 'Add/Modify a Co-author', + listusers => 'Manage Co-authors', + }, + course => { + upload => 'Upload a File of Course Users', + singleuser => 'Add/Modify a Course User', + listusers => 'Manage Course Users', + }, + community => { + upload => 'Upload a File of Community Users', + singleuser => 'Add/Modify a Community User', + listusers => 'Manage Community Users', + }, ); - my @menu = - ( - { text => $links{$context}{'upload'}, - help => 'Course_Create_Class_List', - action => 'upload', - permission => $permission->{'cusr'}, + my %linktitles = ( + domain => { + singleuser => 'Add a user to the domain, and/or a course or community in the domain.', + listusers => 'Show and manage users in this domain.', + }, + author => { + singleuser => 'Add a user with a co- or assistant author role.', + listusers => 'Show and manage co- or assistant authors.', + }, + course => { + singleuser => 'Add a user with a certain role to this course.', + listusers => 'Show and manage users in this course.', + }, + community => { + singleuser => 'Add a user with a certain role to this community.', + listusers => 'Show and manage users in this community.', + }, + ); + my @menu = ( {categorytitle => 'Single Users', + items => + [ + { + linktext => $links{$linkcontext}{'singleuser'}, + icon => 'edit-redo.png', + #help => 'Course_Change_Privileges', + url => '/adm/createuser?action=singleuser', + permission => $permission->{'cusr'}, + linktitle => $linktitles{$linkcontext}{'singleuser'}, + }, + ]}, + + {categorytitle => 'Multiple Users', + items => + [ + { + linktext => $links{$linkcontext}{'upload'}, + icon => 'sctr.png', + #help => 'Course_Create_Class_List', + url => '/adm/createuser?action=upload', + permission => $permission->{'cusr'}, + linktitle => 'Upload a CSV or a text file containing users.', }, - { text => $links{$context}{'singleuser'}, - help => 'Course_Change_Privileges', - action => 'singleuser', - permission => $permission->{'cusr'}, + { + linktext => $links{$linkcontext}{'listusers'}, + icon => 'edit-find.png', + #help => 'Course_View_Class_List', + url => '/adm/createuser?action=listusers', + permission => ($permission->{'view'} || $permission->{'cusr'}), + linktitle => $linktitles{$linkcontext}{'listusers'}, + }, + + ]}, + + {categorytitle => 'Administration', + items => [ ]}, + ); + + if ($context eq 'domain'){ + + push(@{ $menu[2]->{items} }, #Category: Administration + { + linktext => 'Custom Roles', + icon => 'emblem-photos.png', + #help => 'Course_Editing_Custom_Roles', + url => '/adm/createuser?action=custom', + permission => $permission->{'custom'}, + linktitle => 'Configure a custom role.', }, - { text => $links{$context}{'listusers'}, - help => 'Course_View_Class_List', - action => 'listusers', - permission => ($permission->{'view'} || $permission->{'cusr'}), - }, ); - if ($context eq 'domain' || $context eq 'course') { - my $customlink = { text => 'Edit Custom Roles', - help => 'Course_Editing_Custom_Roles', - action => 'custom', - permission => $permission->{'custom'}, - }; - push(@menu,$customlink); - } - if ($context eq 'course') { + + }elsif ($context eq 'course'){ my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); - my @courselinks = - ( - { text => 'Enroll a Single Student', - help => 'Course_Add_Student', - action => 'singlestudent', - permission => $permission->{'cusr'}, - }, - { text => 'Drop Students', - help => 'Course_Drop_Student', - action => 'drop', - permission => $permission->{'cusr'}, - }); - if (!exists($permission->{'cusr_section'})) { + + my %linktext = ( + 'Course' => { + single => 'Add/Modify a Student', + drop => 'Drop Students', + groups => 'Course Groups', + }, + 'Community' => { + single => 'Add/Modify a Member', + drop => 'Drop Members', + groups => 'Community Groups', + }, + ); + + my %linktitle = ( + 'Course' => { + single => 'Add a user with the role of student to this course', + drop => 'Remove a student from this course.', + groups => 'Manage course groups', + }, + 'Community' => { + single => 'Add a user with the role of member to this community', + drop => 'Remove a member from this community.', + groups => 'Manage community groups', + }, + ); + + push(@{ $menu[0]->{items} }, #Category: Single Users + { + linktext => $linktext{$crstype}{'single'}, + #help => 'Course_Add_Student', + icon => 'list-add.png', + url => '/adm/createuser?action=singlestudent', + permission => $permission->{'cusr'}, + linktitle => $linktitle{$crstype}{'single'}, + }, + ); + + push(@{ $menu[1]->{items} }, #Category: Multiple Users + { + linktext => $linktext{$crstype}{'drop'}, + icon => 'edit-undo.png', + #help => 'Course_Drop_Student', + url => '/adm/createuser?action=drop', + permission => $permission->{'cusr'}, + linktitle => $linktitle{$crstype}{'drop'}, + }, + ); + push(@{ $menu[2]->{items} }, #Category: Administration + { + linktext => 'Custom Roles', + icon => 'emblem-photos.png', + #help => 'Course_Editing_Custom_Roles', + url => '/adm/createuser?action=custom', + permission => $permission->{'custom'}, + linktitle => 'Configure a custom role.', + }, + { + linktext => $linktext{$crstype}{'groups'}, + icon => 'conf.png', + #help => 'Course_Manage_Group', + url => '/adm/coursegroups?refpage=cusr', + permission => $permission->{'grp_manage'}, + linktitle => $linktitle{$crstype}{'groups'}, + }, + { + linktext => 'Change Log', + icon => 'document-properties.png', + #help => 'Course_User_Logs', + url => '/adm/createuser?action=changelogs', + permission => $permission->{'cusr'}, + linktitle => 'View change log.', + }, + ); + if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) { + push(@{ $menu[2]->{items} }, + { + linktext => 'Enrollment Requests', + icon => 'selfenrl-queue.png', + #help => 'Course_Approve_Selfenroll', + url => '/adm/createuser?action=selfenrollqueue', + permission => $permission->{'cusr'}, + linktitle =>'Approve or reject enrollment requests.', + }, + ); + } + + if (!exists($permission->{'cusr_section'})){ if ($crstype ne 'Community') { - push(@courselinks, - { text => 'Automated Enrollment Manager', - help => 'Course_Automated_Enrollment', + push(@{ $menu[2]->{items} }, + { + linktext => 'Automated Enrollment', + icon => 'roles.png', + #help => 'Course_Automated_Enrollment', permission => (&Apache::lonnet::auto_run($cnum,$cdom) - && $permission->{'cusr'}), + && $permission->{'cusr'}), url => '/adm/populate', - }); - } - push(@courselinks, - { text => 'Configure User Self-enrollment', - help => 'Course_Self_Enrollment', - action => 'selfenroll', - permission => $permission->{'cusr'}, - }); - } - if ($env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_approval'}) { - push(@courselinks, - { text => 'Enrollment Requests', - help => 'Course_Approve_Selfenroll', - action => 'selfenrollqueue', - permission => $permission->{'cusr'}, - }); - } - push(@courselinks, - { text => 'Manage Course Groups', - help => 'Course_Manage_Group', - permission => $permission->{'grp_manage'}, - url => '/adm/coursegroups?refpage=cusr', - }, - { text => 'View Change Logs', - help => 'Course_User_Logs', - action => 'changelogs', + linktitle => 'Automated enrollment manager.', + } + ); + } + push(@{ $menu[2]->{items} }, + { + linktext => 'User Self-Enrollment', + icon => 'cstr.png', + #help => 'Course_Self_Enrollment', + url => '/adm/createuser?action=selfenroll', permission => $permission->{'cusr'}, - },); + linktitle => 'Configure user self-enrollment.', + }, + ); + } + }; +return Apache::lonhtmlcommon::generate_menu(@menu); # { text => 'View Log-in History', # help => 'Course_User_Logins', # action => 'logins', # permission => $permission->{'cusr'}, # }); - push(@menu,@courselinks); - } - my $menu_html = ''; - foreach my $menu_item (@menu) { - next if (! $menu_item->{'permission'}); - $menu_html.='

'; - if (exists($menu_item->{'help'})) { - $menu_html.= - &Apache::loncommon::help_open_topic($menu_item->{'help'}); - } - $menu_html.=''; - if (exists($menu_item->{'url'})) { - $menu_html.=qq{}; - } else { - $menu_html.= - qq{}; } - $menu_html.= &mt($menu_item->{'text'}).''; - $menu_html.='

'; - } - return $menu_html; +} + +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 { @@ -4680,9 +4885,7 @@ ENDSCRIPT if (ref($lt) eq 'HASH') { $title = $lt->{$item}; } - $output .= - &Apache::lonhtmlcommon::row_title($title, - 'LC_selfenroll_pick_box_title','LC_oddrow_value')."\n"; + $output .= &Apache::lonhtmlcommon::row_title($title); if ($item eq 'types') { my $curr_types = $env{'course.'.$env{'request.course.id'}.'.internal.selfenroll_types'}; my $showdomdesc = 1; @@ -5145,7 +5348,6 @@ sub print_userchangelogs_display { my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum); if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); } - $r->print(''); my %saveable_parameters = ('show' => 'scalar',); &Apache::loncommon::store_course_settings('roles_log', \%saveable_parameters); @@ -5180,14 +5382,6 @@ sub print_userchangelogs_display { } my (%whodunit,%changed,$version); ($version) = ($r->dir_config('lonVersion') =~ /^([\d\.]+)\-/); - $r->print(&role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype)); - my $showntablehdr = 0; - my $tablehdr = &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - ' '.&mt('When').''.&mt('Who made the change'). - ''.&mt('Changed User').''.&mt('Role').''.&mt('Section').''. - &mt('Context').''.&mt('Start').''.&mt('End').''. - &Apache::loncommon::end_data_table_header_row(); my ($minshown,$maxshown); $minshown = 1; my $count = 0; @@ -5197,6 +5391,30 @@ sub print_userchangelogs_display { $minshown = 1 + ($curr{'page'} - 1) * $curr{'show'}; } } + + # Form Header + $r->print(''. + &role_display_filter($formname,$cdom,$cnum,\%curr,$version,$crstype)); + + # Create navigation + my ($nav_script,$nav_links) = &userlogdisplay_nav($formname,\%curr,$more_records); + my $showntableheader = 0; + + # Table Header + my $tableheader = + &Apache::loncommon::start_data_table_header_row() + .' ' + .''.&mt('When').'' + .''.&mt('Who made the change').'' + .''.&mt('Changed User').'' + .''.&mt('Role').'' + .''.&mt('Section').'' + .''.&mt('Context').'' + .''.&mt('Start').'' + .''.&mt('End').'' + .&Apache::loncommon::end_data_table_header_row(); + + # Display user change log data foreach my $id (sort { $roleslog{$b}{'exe_time'}<=>$roleslog{$a}{'exe_time'} } (keys(%roleslog))) { next if (($roleslog{$id}{'exe_time'} < $curr{'rolelog_start_date'}) || ($roleslog{$id}{'exe_time'} > $curr{'rolelog_end_date'})); @@ -5218,9 +5436,13 @@ sub print_userchangelogs_display { } $count ++; next if ($count < $minshown); - if (!$showntablehdr) { - $r->print($tablehdr); - $showntablehdr = 1; + unless ($showntableheader) { + $r->print($nav_script + .$nav_links + .&Apache::loncommon::start_data_table() + .$tableheader); + $r->rflush(); + $showntableheader = 1; } if ($whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} eq '') { $whodunit{$roleslog{$id}{'exe_uname'}.':'.$roleslog{$id}{'exe_udom'}} = @@ -5260,20 +5482,45 @@ sub print_userchangelogs_display { if ($chgcontext ne '' && $lt{$chgcontext} ne '') { $chgcontext = $lt{$chgcontext}; } - $r->print(&Apache::loncommon::start_data_table_row().''.$count.''.&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.''.$rolestart.''.$roleend.''.&Apache::loncommon::end_data_table_row()."\n"); + $r->print( + &Apache::loncommon::start_data_table_row() + .''.$count.'' + .''.&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.'' + .''.$rolestart.'' + .''.$roleend.'' + .&Apache::loncommon::end_data_table_row()."\n"); + } + + if ($showntableheader) { # Table footer, if content displayed above + $r->print(&Apache::loncommon::end_data_table() + .$nav_links); + } else { # No content displayed above + $r->print('

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

' + ); } - if ($showntablehdr) { - $r->print(&Apache::loncommon::end_data_table().'
'); - if (($curr{'page'} > 1) || ($more_records)) { - $r->print(''); - if ($curr{'page'} > 1) { - $r->print(''); - } - if ($more_records) { - $r->print(''); - } - $r->print('
'.&mt('Previous [_1] changes',$curr{'show'}).''.&mt('Next [_1] changes',$curr{'show'}).'
'); - $r->print(<<"ENDSCRIPT"); + + # Form Footer + $r->print( + '' + .'' + .''); + return; +} + +sub userlogdisplay_nav { + my ($formname,$curr,$more_records) = @_; + my ($nav_script,$nav_links); + if (ref($curr) eq 'HASH') { + # Create Navigation: + # Navigation Script + $nav_script = <<"ENDSCRIPT"; ENDSCRIPT + # Navigation Buttons + $nav_links = '

'; + if (($curr->{'page'} > 1) || ($more_records)) { + if ($curr->{'page'} > 1) { + $nav_links .= ' '; + } + if ($more_records) { + $nav_links .= ''; + } } - } else { - $r->print('

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

'); + $nav_links .= '

'; } - $r->print(''. - ''); - return; + return ($nav_script,$nav_links); } sub role_display_filter { @@ -5319,9 +5576,13 @@ sub role_display_filter { $curr->{'rolelog_end_date'},undef, undef,undef,undef,undef,undef,undef,$nolink); my %lt = &rolechg_contexts($crstype); - $output .= ''.&mt('Window during which changes occurred:').'
'.&mt('After:'). - ''.$startform.'
'.&mt('Before:').''. - $endform.'
  '. + $output .= ''.&mt('Window during which changes occurred:').'
'. + ''. + ''. + '
'.&mt('After:'). + ''.$startform.'
'.&mt('Before:').''.$endform.'
'. + ''. + '  '. ''.&mt('Role:').'
'. '  '. + $output .= ''. + '  '. + ''. &mt('Context:').'
' - .'

'; - - # Server version info - $output .= '

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



'; + .'


'; return $output; } @@ -5784,7 +6038,7 @@ sub build_search_response { &Apache::lonuserutils::can_create_user($createdom,$context); my $targetdom = ''.$createdom.''; if ($cancreate) { - my $showdom = &display_domain_info($createdom); + my $showdom = &display_domain_info($createdom); $response .= '

' .''.&mt('To add a new user:').'' .'
'; @@ -5793,7 +6047,7 @@ sub build_search_response { } else { $response .= &mt("(You can only create new users in your current role's domain - [_1])",$targetdom); } - $response .= '
  • ' + $response .='
    • ' .&mt("Set 'Domain/institution to search' to: [_1]",''.$showdom.'') .'
    • ' .&mt("Set 'Search criteria' to: [_1]username is ..... in selected LON-CAPA domain[_2]",'','') @@ -5811,10 +6065,10 @@ sub build_search_response { $response .= &mt("You are not authorized to create new users in your current role's domain - [_1].",$targetdom); } $response .= '
      ' - .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.' + .&mt('Please contact the [_1]helpdesk[_2] if you need to create a new user.' ,' ' ,'') - .'

      '; + .'

      '; } } } @@ -5919,7 +6173,7 @@ sub course_level_table { my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype); foreach my $role (@roles) { my $plrole=&Apache::lonnet::plaintext($role,$crstype); - if ((&Apache::lonnet::allowed('c'.$role,$thiscourse)) || + 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); @@ -6012,7 +6266,7 @@ sub course_level_dc { ''. ''; my $courseform=''.&Apache::loncommon::selectcourse_link - ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').''; + ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course/Community','crstype').'
      '; my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu','role','Course/Community Browser'); my %lt=&Apache::lonlocal::texthash( 'rol' => "Role", @@ -6122,8 +6376,7 @@ sub update_selfenroll_config { $newnum ++; } } - for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) { - if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) { + for (my $j=0; $j<$env{'form.selfenroll_types_total'}; $j++) { if ((!grep(/^$j$/,@deletedoms)) && (!grep(/^$j$/,@activations))) { my @types = &Apache::loncommon::get_env_multiple('form.selfenroll_types_'.$j); if (@types > 0) { @types = sort(@types); @@ -6435,7 +6688,7 @@ sub is_courseowner { } if ($courseowner ne '') { if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) { - return 1; + return 1; } } return;