--- loncom/interface/loncreateuser.pm 2009/10/26 15:54:34 1.317 +++ loncom/interface/loncreateuser.pm 2010/11/08 19:52:01 1.329.2.6 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # Create a user # -# $Id: loncreateuser.pm,v 1.317 2009/10/26 15:54:34 bisitz Exp $ +# $Id: loncreateuser.pm,v 1.329.2.6 2010/11/08 19:52:01 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -51,13 +51,14 @@ In LON-CAPA, roles are actually collecti Assistant", "Course Coordinator", and other such roles are really just collection of privileges that are useful in many circumstances. -Creating custom roles can be done by the Domain Coordinator through -the Create User functionality. That screen will show all privileges -that can be assigned to users. For a complete list of privileges, -please see C. +Custom roles can be defined by a Domain Coordinator, Course Coordinator +or Community Coordinator via the Manage User functionality. +The custom role editor screen will show all privileges which can be +assigned to users. For a complete list of privileges, please see +C. -Custom role definitions are stored in the C file of the role -author. +Custom role definitions are stored in the C file of the creator +of the role. =cut @@ -69,6 +70,7 @@ use Apache::lonlocal; use Apache::longroup; use Apache::lonuserutils; use Apache::loncoursequeueadmin; +use Apache::lonrequestcourse; use LONCAPA qw(:DEFAULT :match); my $loginscript; # piece of javascript used in two separate instances @@ -468,9 +470,10 @@ sub courserequest_display { # =================================================================== Phase one sub print_username_entry_form { - my ($r,$context,$response,$srch,$forcenewuser) = @_; + my ($r,$context,$response,$srch,$forcenewuser,$crstype,$brcrum) = @_; my $defdom=$env{'request.role.domain'}; my $formtoset = 'crtuser'; + my $is_custom = &Apache::loncommon::needs_gci_custom(); if (exists($env{'form.startrolename'})) { $formtoset = 'docustom'; $env{'form.rolename'} = $env{'form.startrolename'}; @@ -487,22 +490,16 @@ sub print_username_entry_form { '// ]]>'."\n". ''."\n"; - my %loaditems = ( - 'onload' => "javascript:setFormElements(document.$formtoset)", - ); - my %breadcrumb_text = &singleuser_breadcrumb(); - my $start_page = - &Apache::loncommon::start_page('User Management', - $jscript,{'add_entries' => \%loaditems,}); - if ($env{'form.action'} eq 'custom') { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.crtuser)", - text=>"Pick custom role",}); - } else { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.crtuser)", - text=>$breadcrumb_text{'search'}, - faq=>282,bug=>'Instructor Interface',}); + my %existingroles=&Apache::lonuserutils::my_custom_roles($crstype); + if (($env{'form.action'} eq 'custom') && (keys(%existingroles) > 0) + && (&Apache::lonnet::allowed('mcr','/'))) { + $jscript .= &customrole_javascript(); + } + my $title = 'User Management'; + if ($context eq 'course') { + if ($is_custom) { + $title = 'Enrollment and Student Activity'; + } } my $helpitem = 'Course_Change_Privileges'; if ($env{'form.action'} eq 'custom') { @@ -510,50 +507,134 @@ sub print_username_entry_form { } elsif ($env{'form.action'} eq 'singlestudent') { $helpitem = 'Course_Add_Student'; } - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management', - $helpitem); - my %existingroles=&Apache::lonuserutils::my_custom_roles(); - my $choice=&Apache::loncommon::select_form('make new role','rolename', - ('make new role' => 'Generate new role ...',%existingroles)); + my %breadcrumb_text = &singleuser_breadcrumb($crstype); + if ($env{'form.action'} eq 'custom') { + push(@{$brcrum}, + {href=>"javascript:backPage(document.crtuser)", + text=>"Pick custom role", + help => $helpitem,} + ); + } else { + push (@{$brcrum}, + {href => "javascript:backPage(document.crtuser)", + text => $breadcrumb_text{'search'}, + help => $helpitem, + faq => 282, + bug => 'Instructor Interface',} + ); + } + my %loaditems = ( + 'onload' => "javascript:setFormElements(document.$formtoset)", + ); + my $args = {bread_crumbs => $brcrum, + bread_crumbs_component => 'User Management', + add_entries => \%loaditems,}; + $r->print(&Apache::loncommon::start_page($title,$jscript,$args)); + 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", - 'ecrp' => "Edit Custom Role Privileges", - 'nr' => "Name of Role", + 'ecrp' => "Define or Edit Custom Role", + 'nr' => "role name", 'cre' => "Next", ); - $r->print($start_page."\n".$crumbs); if ($env{'form.action'} eq 'custom') { if (&Apache::lonnet::allowed('mcr','/')) { - $r->print(< - - -

$lt{'ecrp'}

-$choice $lt{'nr'}:
- - -ENDCUSTOM + my $newroletext = &mt('Define new custom role:'); + $r->print('
'. + ''. + ''. + '

'.$lt{'ecrp'}.'

'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_row(). + ''); + if (keys(%existingroles) > 0) { + $r->print('
'); + } else { + $r->print('
'.$newroletext.''); + } + $r->print(''.$lt{'nr'}.'
'. + &Apache::loncommon::end_data_table_row()); + if (keys(%existingroles) > 0) { + $r->print(&Apache::loncommon::start_data_table_row().'
'. + ''. + '
'. + ''. + ''. + &Apache::loncommon::end_data_table_row()); + } + $r->print(&Apache::loncommon::end_data_table().'

'. + '

'. + '
'); } } else { my $actiontext = $lt{'srad'}; if ($env{'form.action'} eq 'singlestudent') { - $actiontext = $lt{'srst'}; + if ($crstype eq 'Community') { + $actiontext = $lt{'srme'}; + } else { + $actiontext = $lt{'srst'}; + } } - $r->print(" -

$actiontext

"); + $r->print("

$actiontext

"); if ($env{'form.origform'} ne 'crtusername') { $r->print("\n".$response); } - $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response)); + $r->print(&entry_form($defdom,$srch,$forcenewuser,$context,$response,$crstype)); } - $r->print(&Apache::loncommon::end_page()); +} + +sub customrole_javascript { + my $js = <<"END"; + +END + return $js; } sub entry_form { - my ($dom,$srch,$forcenewuser,$context,$responsemsg) = @_; + my ($dom,$srch,$forcenewuser,$context,$responsemsg,$crstype) = @_; my %domconf = &Apache::lonnet::get_dom('configuration',['usercreation'],$dom); my ($usertype,$inexact); if (ref($srch) eq 'HASH') { @@ -590,9 +671,10 @@ $userpicker ENDBLOCK if ($env{'form.phase'} eq '') { my $defdom=$env{'request.role.domain'}; - my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain'); + my $domform = &Apache::loncommon::select_dom_form($defdom,'srchdomain','',1); my %lt=&Apache::lonlocal::texthash( 'enro' => 'Enroll one student', + 'enrm' => 'Enroll one member', 'admo' => 'Add/modify a single user', 'crea' => 'create new user if required', 'uskn' => "username is known", @@ -604,8 +686,12 @@ ENDBLOCK ); my $sellink=&Apache::loncommon::selectstudent_link('crtusername','srchterm','srchdomain'); my ($title,$buttontext,$showresponse); - if ($env{'form.action'} eq 'singlestudent') { - $title = $lt{'enro'}; + if ($env{'form.action'} eq 'singlestudent') { + if ($crstype eq 'Community') { + $title = $lt{'enrm'}; + } else { + $title = $lt{'enro'}; + } $buttontext = $lt{'enrl'}; } else { $title = $lt{'admo'}; @@ -634,7 +720,7 @@ $showresponse - + @@ -676,9 +762,10 @@ END # =================================================================== Phase two sub print_user_selection_page { - my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements) = @_; + my ($r,$response,$srch,$srch_results,$srcharray,$context,$opener_elements,$crstype,$brcrum) = @_; my @fields = ('username','domain','lastname','firstname','permanentemail'); my $sortby = $env{'form.sortby'}; + my $is_custom = &Apache::loncommon::needs_gci_custom(); if (!grep(/^\Q$sortby\E$/,@fields)) { $sortby = 'lastname'; @@ -704,8 +791,10 @@ ENDSCRIPT my %lt=&Apache::lonlocal::texthash( 'usrch' => "User Search to add/modify roles", 'stusrch' => "User Search to enroll student", + 'memsrch' => "User Search to enroll member", 'usel' => "Select a user to add/modify roles", - 'stusel' => "Select a user to enroll as a student", + 'stusel' => "Select a user to enroll as a student", + 'memsel' => "Select a user to enroll as a member", 'username' => "username", 'domain' => "domain", 'lastname' => "last name", @@ -715,28 +804,51 @@ ENDSCRIPT if ($context eq 'requestcrs') { $r->print('
'); } else { - $r->print(&Apache::loncommon::start_page('User Management',$jscript)); - - my %breadcrumb_text = &singleuser_breadcrumb(); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.usersrchform,'','')", - text=>$breadcrumb_text{'search'}, - faq=>282,bug=>'Instructor Interface',}, - {href=>"javascript:backPage(document.usersrchform,'get_user_info','select')", - text=>$breadcrumb_text{'userpicked'}, - faq=>282,bug=>'Instructor Interface',}); + my $title = 'User Management'; + if ($context eq 'course') { + if ($is_custom) { + $title = 'Enrollment and Student Activity'; + } + } + my %breadcrumb_text = &singleuser_breadcrumb($crstype); + my $helpitem; + if ($env{'form.action'} eq 'singleuser') { + $helpitem = 'Course_Change_Privileges'; + } elsif ($env{'form.action'} eq 'singlestudent') { + $helpitem = 'Course_Add_Student'; + } + push (@{$brcrum}, + {href => "javascript:backPage(document.usersrchform,'','')", + text => $breadcrumb_text{'search'}, + faq => 282, + bug => 'Instructor Interface',}, + {href => "javascript:backPage(document.usersrchform,'get_user_info','select')", + text => $breadcrumb_text{'userpicked'}, + faq => 282, + bug => 'Instructor Interface', + help => $helpitem} + ); + $r->print(&Apache::loncommon::start_page($title,$jscript,{bread_crumbs => $brcrum})); if ($env{'form.action'} eq 'singleuser') { - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', - 'Course_Change_Privileges')); $r->print("$lt{'usrch'}
"); - $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); + $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', - 'Course_Add_Student')); - $r->print($jscript."$lt{'stusrch'}
"); - $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context)); - $r->print('

'.$lt{'stusel'}.'

'); + $r->print($jscript.""); + if ($crstype eq 'Community') { + $r->print($lt{'memsrch'}); + } else { + $r->print($lt{'stusrch'}); + } + $r->print("
"); + $r->print(&entry_form($srch->{'srchdomain'},$srch,undef,$context,undef,$crstype)); + $r->print('

'); + if ($crstype eq 'Community') { + $r->print($lt{'memsel'}); + } else { + $r->print($lt{'stusel'}); + } + $r->print('

'); } } $r->print('
'. @@ -803,7 +915,7 @@ ENDSCRIPT } sub print_user_query_page { - my ($r,$caller) = @_; + my ($r,$caller,$brcrum) = @_; # FIXME - this is for a network-wide name search (similar to catalog search) # To use frames with similar behavior to catalog/portfolio search. # To be implemented. @@ -811,11 +923,11 @@ sub print_user_query_page { } sub print_user_modification_page { - my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission) = @_; + my ($r,$ccuname,$ccdomain,$srch,$response,$context,$permission,$crstype,$brcrum) = @_; if (($ccuname eq '') || ($ccdomain eq '')) { my $usermsg = &mt('No username and/or domain provided.'); $env{'form.phase'} = ''; - &print_username_entry_form($r,$context,$usermsg); + &print_username_entry_form($r,$context,$usermsg,'','',$crstype,$brcrum); return; } my ($form,$formname); @@ -829,12 +941,21 @@ sub print_user_modification_page { my %abv_auth = &auth_abbrev(); my (%rulematch,%inst_results,$newuser,%alerts,%curr_rules,%got_rules); my $uhome=&Apache::lonnet::homeserver($ccuname,$ccdomain); + my $is_custom = &Apache::loncommon::needs_gci_custom(); + if ($is_custom) { + if ($uhome eq 'no_host') { + my $lc_ccuname = lc($ccuname); + if ($lc_ccuname ne $ccuname) { + $uhome = &Apache::lonnet::homeserver($lc_ccuname,$ccdomain); + $ccuname = $lc_ccuname; + } + } + } 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 $usertype = + &Apache::lonuserutils::check_usertype($ccdomain,$ccuname,$rules); my $cancreate = &Apache::lonuserutils::can_create_user($ccdomain,$context, $usertype); @@ -844,19 +965,28 @@ sub print_user_modification_page { official => 'institutional', unofficial => 'non-institutional', ); + if ($ccdomain eq 'gci') { + $usertypetext{'unofficial'} = '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). - '
'; + if ($is_custom) { + $response = ''.&mt('Invalid format for username for new user: [_1]',''.$ccuname.''). + '
'; + } else { + $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('Please contact the [_1]helpdesk[_2] for assistance.' - ,'','') - .'


'; + .'
'; + if ($ccdomain eq 'gcitest') { + $response .= &mt('Enter a valid e-mail address as the username for the new user.').' '.&mt('Please contact the [_1]helpdesk[_2] for assistance.' + ,'','') + .'


'; + } $env{'form.phase'} = ''; - &print_username_entry_form($r,$context,$response); + &print_username_entry_form($r,$context,$response,undef,undef,$crstype,$brcrum); return; } $newuser = 1; @@ -880,7 +1010,7 @@ sub print_user_modification_page { 'username'); } $env{'form.phase'} = ''; - &print_username_entry_form($r,$context,$userchkmsg); + &print_username_entry_form($r,$context,$userchkmsg,undef,undef,$crstype,$brcrum); return; } } @@ -901,34 +1031,43 @@ sub print_user_modification_page { my $js = &validation_javascript($context,$ccdomain,$pjump_def, $groupslist,$newuser,$formname,\%loaditem); - my $args = {'add_entries' => \%loaditem}; - if ($env{'form.popup'}) { - $args->{'no_nav_bar'} = 1; + my $title = 'User Management'; + if ($context eq 'course') { + if ($is_custom) { + $title = 'Enrollment and Student Activity'; + } } - my $start_page = - &Apache::loncommon::start_page('User Management',$js,$args); - my %breadcrumb_text = &singleuser_breadcrumb(); - &Apache::lonhtmlcommon::add_breadcrumb - ({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($form,'get_user_info','select')", - text=>$breadcrumb_text{'userpicked'}, - faq=>282,bug=>'Instructor Interface',}); - } - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage($form,'$env{'form.phase'}','modify')", - text=>$breadcrumb_text{'modify'}, - faq=>282,bug=>'Instructor Interface',}); + my %breadcrumb_text = &singleuser_breadcrumb($crstype); my $helpitem = 'Course_Change_Privileges'; if ($env{'form.action'} eq 'singlestudent') { $helpitem = 'Course_Add_Student'; } - my $crumbs = &Apache::lonhtmlcommon::breadcrumbs('User Management', - $helpitem); + push (@{$brcrum}, + {href => "javascript:backPage($form)", + text => $breadcrumb_text{'search'}, + faq => 282, + bug => 'Instructor Interface',}); + if ($env{'form.phase'} eq 'userpicked') { + push(@{$brcrum}, + {href => "javascript:backPage($form,'get_user_info','select')", + text => $breadcrumb_text{'userpicked'}, + faq => 282, + bug => 'Instructor Interface',}); + } + push(@{$brcrum}, + {href => "javascript:backPage($form,'$env{'form.phase'}','modify')", + text => $breadcrumb_text{'modify'}, + faq => 282, + bug => 'Instructor Interface', + help => $helpitem}); + my $args = {'add_entries' => \%loaditem, + 'bread_crumbs' => $brcrum, + 'bread_crumbs_component' => 'User Management'}; + if ($env{'form.popup'}) { + $args->{'no_nav_bar'} = 1; + } + my $start_page = + &Apache::loncommon::start_page($title,$js,$args); my $forminfo =<<"ENDFORMINFO"; @@ -939,10 +1078,24 @@ sub print_user_modification_page { ENDFORMINFO - my %inccourses; - foreach my $key (keys(%env)) { - if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) { - $inccourses{$1.'_'.$2}=1; + my (%inccourses,$roledom); + if ($context eq 'course') { + $inccourses{$env{'request.course.id'}}=1; + $roledom = $env{'course.'.$env{'request.course.id'}.'.domain'}; + } elsif ($context eq 'author') { + $roledom = $env{'request.role.domain'}; + } elsif ($context eq 'domain') { + foreach my $key (keys(%env)) { + $roledom = $env{'request.role.domain'}; + if ($key=~/^user\.priv\.cm\.\/($roledom)\/($match_username)/) { + $inccourses{$1.'_'.$2}=1; + } + } + } else { + foreach my $key (keys(%env)) { + if ($key=~/^user\.priv\.cm\.\/($match_domain)\/($match_username)/) { + $inccourses{$1.'_'.$2}=1; + } } } if ($newuser) { @@ -956,13 +1109,13 @@ ENDFORMINFO my %lt=&Apache::lonlocal::texthash( 'cnu' => 'Create New User', 'ast' => 'as a student', + 'ame' => 'as a member', 'ind' => 'in domain', 'lg' => 'Login Data', 'hs' => "Home Server", ); $r->print(< @@ -974,7 +1127,11 @@ $loginscript

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

'."\n".'
'); my $personal_table = @@ -993,7 +1150,7 @@ $lt{'hs'}: $home_server_pick $r->print($home_server_pick); } if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { - $r->print('

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

'. + $r->print('

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

'. &Apache::loncommon::start_data_table(). &build_tools_display($ccuname,$ccdomain, 'requestcourses'). @@ -1067,16 +1224,20 @@ ENDAUTH my %lt=&Apache::lonlocal::texthash( 'cup' => "Modify existing user: ", 'ens' => "Enroll one student: ", + 'enm' => "Enroll one member: ", 'id' => "in domain", ); $r->print(< ENDCHANGEUSER if ($env{'form.action'} eq 'singlestudent') { - $r->print($lt{'ens'}); + if ($crstype eq 'Community') { + $r->print($lt{'enm'}); + } else { + $r->print($lt{'ens'}); + } } else { $r->print($lt{'cup'}); } @@ -1090,7 +1251,7 @@ ENDCHANGEUSER $r->print(&Apache::lonuserutils::forceid_change($context)); } if (&Apache::lonnet::allowed('ccc',$env{'request.role.domain'})) { - $r->print('

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

'. + $r->print('

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

'. &Apache::loncommon::start_data_table()); if ($env{'request.role.domain'} eq $ccdomain) { $r->print(&build_tools_display($ccuname,$ccdomain,'requestcourses')); @@ -1169,12 +1330,18 @@ ENDNOTOOLSPRIV } $r->print('
'); if ($env{'form.action'} ne 'singlestudent') { - &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses); + &display_existing_roles($r,$ccuname,$ccdomain,\%inccourses,$context, + $roledom,$crstype); } } ## End of new user/old user logic - if ($env{'form.action'} eq 'singlestudent') { - $r->print('
'."\n"); + my $btntxt; + if ($crstype eq 'Community') { + $btntxt = &mt('Enroll Member'); + } else { + $btntxt = &mt('Enroll Student'); + } + $r->print('
'."\n"); } else { $r->print('

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

'); my $addrolesdisplay = 0; @@ -1207,15 +1374,19 @@ ENDNOTOOLSPRIV } $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','userrole','ccdomain','prevphase','currstate','ccuname','ccdomain'])); $r->print(''); - $r->print(''); - $r->print("".&Apache::loncommon::end_page()); + $r->print(''); return; } sub singleuser_breadcrumb { + my ($crstype) = @_; my %breadcrumb_text; if ($env{'form.action'} eq 'singlestudent') { - $breadcrumb_text{'search'} = 'Enroll a student'; + if ($crstype eq 'Community') { + $breadcrumb_text{'search'} = 'Enroll a member'; + } else { + $breadcrumb_text{'search'} = 'Enroll a student'; + } $breadcrumb_text{'userpicked'} = 'Select a user', $breadcrumb_text{'modify'} = 'Set section/dates', } else { @@ -1279,13 +1450,9 @@ sub validation_javascript { } 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( + my ($r,$ccuname,$ccdomain,$inccourses,$context,$roledom,$crstype) = @_; + my $now=time; + my %lt=&Apache::lonlocal::texthash( 'rer' => "Existing Roles", 'rev' => "Revoke", 'del' => "Delete", @@ -1295,197 +1462,255 @@ sub display_existing_roles { '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); + 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 = + &Apache::lonnet::get_my_roles($ccuname,$ccdomain,'userroles', + ['active','previous','future'],\@roles,$roledom,1); + foreach my $key (keys(%roleshash)) { + my ($start,$end) = split(':',$roleshash{$key}); + next if ($start eq '-1' || $end eq '-1'); + my ($rnum,$rdom,$role,$sec) = split(':',$key); + if ($context eq 'course') { + next unless (($rnum eq $env{'course.'.$env{'request.course.id'}.'.num'}) + && ($rdom eq $env{'course.'.$env{'request.course.id'}.'.domain'})); + } elsif ($context eq 'author') { + next unless (($rnum eq $env{'user.name'}) && ($rdom eq $env{'request.role.domain'})); + } + my ($newkey,$newvalue,$newrole); + $newkey = '/'.$rdom.'/'.$rnum; + if ($sec ne '') { + $newkey .= '/'.$sec; + } + $newvalue = $role; + if ($role =~ /^cr/) { + $newrole = 'cr'; + } else { + $newrole = $role; + } + $newkey .= '_'.$newrole; + if ($start ne '' && $end ne '') { + $newvalue .= '_'.$end.'_'.$start; + } + $rolesdump{$newkey} = $newvalue; + } + } else { + %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); + return if ($tmp =~ /^(con_lost|error)/i); + 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). - &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom); - $sortkey.="\0".$coursedata{'description'}; - $class=$coursedata{'type'}; + 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); + my $cid = $1.'_'.$2; + # $1.'_'.$2 is the course id (eg. 103_12345abcef103l3). + my %coursedata= + &Apache::lonnet::coursedescription($cid); + if ($coursedir =~ /^$match_community$/) { + $class='Community'; + } + $sortkey.="\0$coursedom"; + my $carea; + if (defined($coursedata{'description'})) { + $carea=$coursedata{'description'}. + '
'.&mt('Domain').': '.$coursedom.(' 'x8). + &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$coursedir,$coursedom); + $sortkey.="\0".$coursedata{'description'}; + } else { + if ($class eq 'Community') { + $carea=&mt('Unavailable community').': '.$area; + $sortkey.="\0".&mt('Unavailable community').': '.$area; } 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$coursedir"; + $inccourses->{$cid}=1; + if ((&Apache::lonnet::allowed('c'.$role_code,$coursedom.'/'.$coursedir)) || + (&Apache::lonnet::allowed('c'.$role_code,$ccdomain))) { + $allowed=1; + } + unless ($allowed) { + my $isowner = &is_courseowner($cid,$coursedata{'internal.courseowner'}); + if ($isowner) { + if (($role_code eq 'co') && ($class eq 'Community')) { + $allowed = 1; + } elsif (($role_code eq 'cc') && ($class eq 'Course')) { + $allowed = 1; + } } + } + if ((&Apache::lonnet::allowed('dro',$coursedom)) || + (&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; - } + if ($croletitle) { + if (&Apache::lonnet::allowed('ccr',$coursedom.'/'.$coursedir)) { + $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; - } + } + 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; - } + } + $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 ($role_code eq 'ca' || $role_code eq 'au') { - $class='Construction Space'; - } elsif ($role_code eq 'su') { - $class='System'; - } else { - $class='Domain'; + if (((&Apache::lonnet::allowed('dro',$1)) || + (&Apache::lonnet::allowed('dro',$ccdomain))) && + ($role_code ne 'dc')) { + $delallowed=1; } - } - if (($role_code eq 'ca') || ($role_code eq 'aa')) { - $area=~m{/($match_domain)/($match_username)}; - if (&Apache::lonuserutils::authorpriv($2,$1)) { + } else { + if (&Apache::lonnet::allowed('c'.$role_code,'/')) { $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) { - my $contextrole=''; - if ($env{'request.course.id'}) { - $contextrole = 'Existing Roles in this Course'; - } elsif ($env{'request.role'} =~ /^au\./) { - $contextrole = 'Existing Co-Author Roles in your Construction Space'; + } + $row.= '"; + $sortrole{$sortkey}=$envkey; + $roletext{$envkey}=$row; + $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}.= + &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) { + my $contextrole=''; + if ($env{'request.course.id'}) { + if (&Apache::loncommon::course_type() eq 'Community') { + $contextrole = &mt('Existing Roles in this Community'); } else { - $contextrole = 'Existing Roles in this Domain'; + $contextrole = &mt('Existing Roles in this Course'); } - $r->print(' + } elsif ($env{'request.role'} =~ /^au\./) { + $contextrole = &mt('Existing Co-Author Roles in your Construction Space'); + } else { + $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(). ''. &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"); - } + foreach my $type ('Construction Space','Course','Community','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 + $r->print(&Apache::loncommon::end_data_table()); + } return; } @@ -1973,7 +2198,8 @@ sub get_inststatuses { # ================================================================= Phase Three sub update_user_data { - my ($r,$context) = @_; + my ($r,$context,$crstype,$brcrum) = @_; + my $is_custom = &Apache::loncommon::needs_gci_custom(); my $uhome=&Apache::lonnet::homeserver($env{'form.ccuname'}, $env{'form.ccdomain'}); # Error messages @@ -1997,37 +2223,34 @@ sub update_user_data { $jsback."\n". '// ]]>'."\n". ''."\n"; - my %breadcrumb_text = &singleuser_breadcrumb(); - my $args; - if ($env{'form.popup'}) { - $args->{'no_nav_bar'} = 1; - } else { - $args = undef; - } - $r->print(&Apache::loncommon::start_page($title,$jscript,$args)); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.userupdate)", - 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=>$breadcrumb_text{'userpicked'}, - faq=>282,bug=>'Instructor Interface',}); - } - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')", - text=>$breadcrumb_text{'modify'}, - faq=>282,bug=>'Instructor Interface',}, - {href=>"/adm/createuser", - text=>"Result", - faq=>282,bug=>'Instructor Interface',}); + my %breadcrumb_text = &singleuser_breadcrumb($crstype); my $helpitem = 'Course_Change_Privileges'; if ($env{'form.action'} eq 'singlestudent') { $helpitem = 'Course_Add_Student'; } - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', - $helpitem)); + my $bread_crumbs_component = 'User Management'; + if ($context eq 'course') { + if ($is_custom) { + $bread_crumbs_component = 'Enrollment and Student Activity'; + } + } + push(@{$brcrum}, + {href => "javascript:backPage(document.userupdate,'$env{'form.prevphase'}','modify')", + text => $breadcrumb_text{'modify'}, + faq => 282, + bug => 'Instructor Interface',}, + {href => "/adm/createuser", + text => "Result", + faq => 282, + bug => 'Instructor Interface', + help => $helpitem}); + my $args = {bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + if ($env{'form.popup'}) { + $args->{'no_nav_bar'} = 1; + } + $r->print(&Apache::loncommon::start_page($title,$jscript,$args)); + $r->print(&update_result_form($uhome)); # Check Inputs if (! $env{'form.ccuname'} ) { @@ -2229,9 +2452,10 @@ sub update_user_data { } } ## - my (@userroles,%userupdate,$cnum,$cdom,$namechanged); + my (@userroles,%userupdate,$cnum,$cdom,$crstype,$namechanged); if ($context eq 'course') { ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); + $crstype = &Apache::loncommon::course_type($cdom.'_'.$cnum); } if (! $env{'form.makeuser'} ) { # Check for need to change @@ -2315,7 +2539,7 @@ sub update_user_data { if ($role eq 'cr') { push(@longroles,'Custom'); } else { - push(@longroles,&Apache::lonnet::plaintext($role)); + push(@longroles,&Apache::lonnet::plaintext($role,$crstype)); } } my @userinfo = ('firstname','middlename','lastname','generation','permanentemail','id'); @@ -2516,7 +2740,8 @@ sub update_user_data { $changeHash{'tools.'.$key}; } else { $newenvhash{'environment.availabletools.'.$key} = - &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'}, $key,'reload','tools'); + &Apache::lonnet::usertools_access($env{'user.name'},$env{'user.domain'}, + $key,'reload','tools'); } } } @@ -2784,9 +3009,14 @@ END .''); } if ($env{'form.action'} eq 'singlestudent') { - &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context); - $r->print('

'. - &mt('Enroll Another Student').'

'); + &enroll_single_student($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype); + $r->print('

'); + if ($crstype eq 'Community') { + $r->print(&mt('Enroll Another Member')); + } else { + $r->print(&mt('Enroll Another Student')); + } + $r->print('

'); } else { my @rolechanges = &update_roles($r,$context); if ($namechanged) { @@ -2815,7 +3045,6 @@ END .&mt('Create/Modify Another User').'

'); } } - $r->print(&Apache::loncommon::end_page()); } sub tool_changes { @@ -3255,8 +3484,14 @@ sub update_roles { } sub enroll_single_student { - my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context) = @_; - $r->print('

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

'); + my ($r,$uhome,$amode,$genpwd,$now,$newuser,$context,$crstype) = @_; + $r->print('

'); + if ($crstype eq 'Community') { + $r->print(&mt('Enrolling Member')); + } else { + $r->print(&mt('Enrolling Student')); + } + $r->print('

'); # Remove non alphanumeric values from section $env{'form.sections'}=~s/\W//g; @@ -3289,7 +3524,13 @@ sub enroll_single_student { } $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.')."

"); + $r->print('

'); + if ($crstype eq 'Community') { + $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('

'); } } else { $r->print(&mt('unable to enroll').": ".$enroll_result); @@ -3413,19 +3654,36 @@ sub build_roles { # ========================================================== Custom Role Editor sub custom_role_editor { - my ($r) = @_; - my $rolename=$env{'form.rolename'}; + my ($r,$brcrum) = @_; + my $action = $env{'form.customroleaction'}; + my $rolename; + if ($action eq 'new') { + $rolename=$env{'form.newrolename'}; + } else { + $rolename=$env{'form.rolename'}; + } - if ($rolename eq 'make new role') { - $rolename=$env{'form.newrolename'}; + my ($crstype,$context); + if ($env{'request.course.id'}) { + $crstype = &Apache::loncommon::course_type(); + $context = 'course'; + } else { + $context = 'domain'; + $crstype = $env{'form.templatecrstype'}; } $rolename=~s/[^A-Za-z0-9]//gs; - if (!$rolename || $env{'form.phase'} eq 'pickrole') { - &print_username_entry_form($r); + &print_username_entry_form($r,undef,undef,undef,undef,$crstype,$brcrum); return; } + my $is_custom = &Apache::loncommon::needs_gci_custom(); + my $title = 'User Management'; + if ($context eq 'course') { + if ($is_custom) { + $title = 'Enrollment and Student Activity'; + } + } # ------------------------------------------------------- What can be assigned? my %full=(); my %courselevel=(); @@ -3434,7 +3692,6 @@ sub custom_role_editor { my $dompriv=''; my $coursepriv=''; my $body_top; - my ($disp_dummy,$disp_roles) = &Apache::lonnet::get('roles',["st"]); my ($rdummy,$roledef)= &Apache::lonnet::get('roles',["rolesdef_$rolename"]); # ------------------------------------------------------- Does this role exist? @@ -3443,6 +3700,9 @@ sub custom_role_editor { $body_top .= &mt('Existing Role').' "'; # ------------------------------------------------- Get current role privileges ($syspriv,$dompriv,$coursepriv)=split(/\_/,$roledef); + if ($crstype eq 'Community') { + $syspriv =~ s/bre\&S//; + } } else { $body_top .= &mt('New Role').' "'; $roledef=''; @@ -3484,39 +3744,90 @@ sub custom_role_editor { my $head_script = "\n"; $head_script .= ''."\n"; - $r->print(&Apache::loncommon::start_page('Custom Role Editor',$head_script)); - &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', - 'Course_Editing_Custom_Roles')); - - $r->print($body_top); + push (@{$brcrum}, + {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', + help => 'Course_Editing_Custom_Roles'} + ); + my $args = { bread_crumbs => $brcrum, + bread_crumbs_component => 'User Management'}; + + $r->print(&Apache::loncommon::start_page('Custom Role Editor', + $head_script,$args). + $body_top); my %lt=&Apache::lonlocal::texthash( 'prv' => "Privilege", 'crl' => "Course Level", 'dml' => "Domain Level", 'ssl' => "System Level"); - $r->print('
' + $r->print('
' .'
' .''.&mt('Select a Template').'' .$button_code - .'
' - .'
' - ); + .'
'); + if ($context_code) { + $r->print('
' + .'
' + .''.&mt('Context').'' + .$context_code + .'' + .'
' + ); + } + $r->print('
'); $r->print(< @@ -3528,8 +3839,8 @@ ENDCCF ''. &Apache::loncommon::end_data_table_header_row()); - foreach my $priv (sort keys %full) { - my $privtext = &Apache::lonnet::plaintext($priv); + foreach my $priv (sort(keys(%full))) { + my $privtext = &Apache::lonnet::plaintext($priv,$crstype); $r->print(&Apache::loncommon::start_data_table_row(). ''. - &Apache::loncommon::end_data_table_row()); + ''. + &Apache::loncommon::end_data_table_row()); } $r->print(&Apache::loncommon::end_data_table(). ''. ''."\n".''."\n". ''."\n". - ''. - &Apache::loncommon::end_page()); + ''); } # -------------------------------------------------------- sub make_script_template { - my ($role) = @_; + my ($role,$crstype) = @_; my %full_c=(); my %full_d=(); my %full_s=(); @@ -3567,6 +3881,7 @@ sub make_script_template { $full_d{$priv}=1; } foreach my $item (split(/\:/,$Apache::lonnet::pr{'cr:s'})) { + next if (($crstype eq 'Community') && ($item eq 'bre&S')); my ($priv,$restrict)=split(/\&/,$item); $full_s{$priv}=1; } @@ -3619,18 +3934,18 @@ sub make_script_template { } # ---------------------------------------------------------- sub make_button_code { - my ($role) = @_; - my $label = &Apache::lonnet::plaintext($role); + my ($role,$crstype) = @_; + my $label = &Apache::lonnet::plaintext($role,$crstype); my $button_code = ''; return ($button_code); } # ---------------------------------------------------------- Call to definerole sub set_custom_role { - my ($r,$context) = @_; + my ($r,$context,$brcrum) = @_; my $rolename=$env{'form.rolename'}; $rolename=~s/[^A-Za-z0-9]//gs; if (!$rolename) { - &custom_role_editor($r); + &custom_role_editor($r,$brcrum); return; } my ($jsback,$elements) = &crumb_utilities(); @@ -3639,20 +3954,32 @@ sub set_custom_role { .$jsback."\n" .'// ]]>'."\n" .''."\n"; + my $bread_crumbs_component = 'User Management'; + my $is_custom = &Apache::loncommon::needs_gci_custom(); + if ($context eq 'course') { + if ($is_custom) { + $bread_crumbs_component = 'Enrollment and Student Activity'; + } + } - $r->print(&Apache::loncommon::start_page('Save Custom Role'),$jscript); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"javascript:backPage(document.customresult,'pickrole','')", - text=>"Pick custom role", - faq=>282,bug=>'Instructor Interface',}, - {href=>"javascript:backPage(document.customresult,'selected_custom_edit','')", - text=>"Edit custom role", - faq=>282,bug=>'Instructor Interface',}, - {href=>"javascript:backPage(document.customresult,'set_custom_roles','')", - text=>"Result", - faq=>282,bug=>'Instructor Interface',}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management', - 'Course_Editing_Custom_Roles')); + push(@{$brcrum}, + {href => "javascript:backPage(document.customresult,'pickrole','')", + text => "Pick custom role", + faq => 282, + bug => 'Instructor Interface',}, + {href => "javascript:backPage(document.customresult,'selected_custom_edit','')", + text => "Edit custom role", + faq => 282, + bug => 'Instructor Interface',}, + {href => "javascript:backPage(document.customresult,'set_custom_roles','')", + text => "Result", + faq => 282, + bug => 'Instructor Interface', + help => 'Course_Editing_Custom_Roles'}, + ); + my $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component }; + $r->print(&Apache::loncommon::start_page('Save Custom Role',$jscript,$args)); my ($rdummy,$roledef)= &Apache::lonnet::get('roles',["rolesdef_$rolename"]); @@ -3709,7 +4036,6 @@ sub set_custom_role { } $r->print('

'.&mt('Create or edit another custom role').'

'); $r->print(&Apache::lonhtmlcommon::echo_form_input([]).''); - $r->print(&Apache::loncommon::end_page()); } # ================================================================ Main Handler @@ -3720,28 +4046,17 @@ sub handler { $r->send_http_header; return OK; } - my $context; + my ($context,$crstype); if ($env{'request.course.id'}) { $context = 'course'; + $crstype = &Apache::loncommon::course_type(); } elsif ($env{'request.role'} =~ /^au\./) { $context = 'author'; } else { $context = 'domain'; } - &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','state','callingform','roletype','showrole','bulkaction','popup','phase', - 'username','domain','srchterm','srchdomain','srchin','srchby','srchtype']); - &Apache::lonhtmlcommon::clear_breadcrumbs(); - if ($env{'form.action'} ne 'dateselect') { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>"/adm/createuser", - text=>"User Management", - help=>'Course_Create_Class_List,Course_Change_Privileges,Course_View_Class_List,Course_Editing_Custom_Roles,Course_Add_Student,Course_Drop_Student,Course_Automated_Enrollment,Course_Self_Enrollment,Course_Manage_Group'}); - } - #SD Following files not added to help, because the corresponding .tex-files seem to - #be missing: Course_Approve_Selfenroll,Course_User_Logs, - my ($permission,$allowed) = - &Apache::lonuserutils::get_permission($context); + my ($permission,$allowed) = + &Apache::lonuserutils::get_permission($context,$crstype); if (!$allowed) { $env{'user.error.msg'}= "/adm/createuser:cst:0:0:Cannot create/modify user data ". @@ -3752,35 +4067,89 @@ sub handler { &Apache::loncommon::content_type($r,'text/html'); $r->send_http_header; + my $title = 'User Management'; + my $is_custom = &Apache::loncommon::needs_gci_custom(); + if ($context eq 'course') { + if ($is_custom) { + $title = 'Enrollment and Student Activity'; + } + } + &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, + ['action','state','callingform','roletype','showrole','bulkaction','popup','phase', + 'username','domain','srchterm','srchdomain','srchin','srchby','srchtype']); + &Apache::lonhtmlcommon::clear_breadcrumbs(); + my $args; + my $brcrum = []; + my $bread_crumbs_component = $title; + if ($env{'form.context'} eq 'requestcrs') { + my $reqstate = 'uploadroster'; + if ($env{'form.state'} eq 'enrolling') { + $reqstate = 'enrolling'; + } + unless (&Apache::lonrequestcourse::generate_page($r,'new',$reqstate)) { + return OK; + } + } elsif ($env{'form.action'} ne 'dateselect') { + $brcrum = [{href=>"/adm/createuser", + 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 + #be missing: Course_Approve_Selfenroll,Course_User_Logs, + # 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(&print_main_menu($permission,$context)); - $r->print(&Apache::loncommon::end_page()); + $args = {bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); + $r->print(&print_main_menu($permission,$context,$crstype)); } elsif ($env{'form.action'} eq 'upload' && $permission->{'cusr'}) { - $r->print(&header()); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=upload&state=', - text=>"Upload Users List"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Upload Users List', - 'Course_Create_Class_List')); - $r->print(''."\n"); + unless ($env{'form.context'} eq 'requestcrs') { + push(@{$brcrum}, + { href => '/adm/createuser?action=upload&state=', + text => 'Upload Users List', + help => 'Course_Create_Class_List', + }); + $bread_crumbs_component = 'Upload Users List'; + $args = {bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); + } + unless (($env{'form.context'} eq 'requestcrs') && ($env{'form.state'} eq 'enrolling')) { + $r->print(''."\n"); + } if (! exists($env{'form.state'})) { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } elsif ($env{'form.state'} eq 'got_file') { + my $formname; + if ($env{'form.context'} eq 'requestcrs') { + $formname = 'studentform'; + } &Apache::lonuserutils::print_upload_manager_form($r,$context, - $permission); + $permission,$crstype,$formname); + if ($env{'form.context'} eq 'requestcrs') { + $r->print(''); + } } elsif ($env{'form.state'} eq 'enrolling') { if ($env{'form.datatoken'}) { &Apache::lonuserutils::upfile_drop_add($r,$context,$permission); + if ($env{'form.context'} eq 'requestcrs') { + $r->print('

'. + ''. + ''. + ''. + ''. + ''. + &Apache::lonrequestcourse::done_display()); + } } } else { &Apache::lonuserutils::print_first_users_upload_form($r,$context); } - $r->print(''.&Apache::loncommon::end_page()); + $r->print(''); } elsif ((($env{'form.action'} eq 'singleuser') || ($env{'form.action'} eq 'singlestudent')) && ($permission->{'cusr'})) { my $phase = $env{'form.phase'}; @@ -3795,15 +4164,15 @@ sub handler { if ($env{'form.phase'} eq 'createnewuser') { my $response; if ($env{'form.srchterm'} !~ /^$match_username$/) { - my $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @'); + my $response = '

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

'; $env{'form.phase'} = ''; - &print_username_entry_form($r,$context,$response,$srch); + &print_username_entry_form($r,$context,$response,$srch,undef,$crstype,$brcrum); } else { my $ccuname =&LONCAPA::clean_username($srch->{'srchterm'}); my $ccdomain=&LONCAPA::clean_domain($srch->{'srchdomain'}); &print_user_modification_page($r,$ccuname,$ccdomain, $srch,$response,$context, - $permission); + $permission,$crstype); } } elsif ($env{'form.phase'} eq 'get_user_info') { my ($currstate,$response,$forcenewuser,$results) = @@ -3813,7 +4182,7 @@ sub handler { } if ($currstate eq 'select') { &print_user_selection_page($r,$response,$srch,$results, - \@search,$context); + \@search,$context,undef,$crstype); } elsif ($currstate eq 'modify') { my ($ccuname,$ccdomain); if (($srch->{'srchby'} eq 'uname') && @@ -3831,42 +4200,46 @@ sub handler { } &print_user_modification_page($r,$ccuname,$ccdomain, $srch,$response,$context, - $permission); + $permission,$crstype,$brcrum); } elsif ($currstate eq 'query') { - &print_user_query_page($r,'createuser'); + &print_user_query_page($r,'createuser',$brcrum); } else { $env{'form.phase'} = ''; &print_username_entry_form($r,$context,$response,$srch, - $forcenewuser); + $forcenewuser,$crstype,$brcrum); } } elsif ($env{'form.phase'} eq 'userpicked') { my $ccuname = &LONCAPA::clean_username($env{'form.seluname'}); my $ccdomain = &LONCAPA::clean_domain($env{'form.seludom'}); &print_user_modification_page($r,$ccuname,$ccdomain,$srch,'', - $context,$permission); + $context,$permission,$crstype,$brcrum); } } elsif ($env{'form.phase'} eq 'update_user_data') { - &update_user_data($r,$context); + &update_user_data($r,$context,$crstype,$brcrum); } else { - &print_username_entry_form($r,$context,undef,$srch); + &print_username_entry_form($r,$context,undef,$srch,undef,$crstype,$brcrum); } } elsif ($env{'form.action'} eq 'custom' && $permission->{'custom'}) { if ($env{'form.phase'} eq 'set_custom_roles') { - &set_custom_role($r,$context); + &set_custom_role($r,$context,$brcrum); } else { - &custom_role_editor($r); + &custom_role_editor($r,$brcrum); } } elsif (($env{'form.action'} eq 'listusers') && ($permission->{'view'} || $permission->{'cusr'})) { if ($env{'form.phase'} eq 'bulkchange') { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=listusers', - text=>"List Users"}, - {href=>"/adm/createuser", - text=>"Result"}); + push(@{$brcrum}, + {href => '/adm/createuser?action=listusers', + text => "List Users"}, + {href => "/adm/createuser", + text => "Result", + help => 'Course_View_Class_List'}); + $bread_crumbs_component = 'Update Users'; + $args = {bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); my $setting = $env{'form.roletype'}; my $choice = $env{'form.bulkaction'}; - $r->print(&header()); $r->print(&Apache::lonhtmlcommon::breadcrumbs("Update Users", 'Course_View_Class_List')); if ($permission->{'cusr'}) { @@ -3875,138 +4248,166 @@ sub handler { } else { $r->print(&mt('You are not authorized to make bulk changes to user roles')); $r->print('

'.&mt('Display User Lists').''); - $r->print(&Apache::loncommon::end_page()); } } else { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=listusers', - text=>"List Users"}); + push(@{$brcrum}, + {href => '/adm/createuser?action=listusers', + text => "List Users", + help => 'Course_View_Class_List'}); + $bread_crumbs_component = 'List Users'; + $args = {bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; my ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles); my $formname = 'studentform'; - if ($context eq 'domain' && $env{'form.roletype'} eq 'course') { - ($cb_jscript,$jscript,$totcodes,$codetitles,$idlist,$idlist_titles) = - &Apache::lonuserutils::courses_selector($env{'request.role.domain'}, - $formname); + 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) = + &Apache::lonuserutils::courses_selector($env{'request.role.domain'}, + $formname); + } elsif ($env{'form.roletype'} eq 'community') { + $cb_jscript = + &Apache::loncommon::coursebrowser_javascript($env{'request.role.domain'}); + my %elements = ( + coursepick => 'radio', + coursetotal => 'text', + courselist => 'text', + ); + $jscript = &Apache::lonhtmlcommon::set_form_elements(\%elements); + } $jscript .= &verify_user_display(); my $js = &add_script($jscript).$cb_jscript; - my $loadcode = + my $loadcode = &Apache::lonuserutils::course_selector_loadcode($formname); if ($loadcode ne '') { - $r->print(&header($js,{'onload' => $loadcode,})); - } else { - $r->print(&header($js)); + $args->{add_entries} = {onload => $loadcode}; } + $r->print(&header($js,$args)); } else { - $r->print(&header(&add_script(&verify_user_display()))); + $r->print(&header(&add_script(&verify_user_display()),$args)); } - $r->print(&Apache::lonhtmlcommon::breadcrumbs("List Users", - 'Course_View_Class_List')); &Apache::lonuserutils::print_userlist($r,undef,$permission,$context, $formname,$totcodes,$codetitles,$idlist,$idlist_titles); - $r->print(&Apache::loncommon::end_page()); } } elsif ($env{'form.action'} eq 'drop' && $permission->{'cusr'}) { - $r->print(&header()); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=drop', - text=>"Drop Students"}); + my $brtext; + if ($crstype eq 'Community') { + $brtext = 'Drop Members'; + } else { + $brtext = 'Drop Students'; + } + push(@{$brcrum}, + {href => '/adm/createuser?action=drop', + text => $brtext, + help => 'Course_Drop_Student'}); + if ($env{'form.state'} eq 'done') { + push(@{$brcrum}, + {href=>'/adm/createuser?action=drop', + text=>"Result"}); + } + $bread_crumbs_component = $brtext; + $args = {bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); if (!exists($env{'form.state'})) { - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Drop Students', - 'Course_Drop_Student')); - - &Apache::lonuserutils::print_drop_menu($r,$context,$permission); + &Apache::lonuserutils::print_drop_menu($r,$context,$permission,$crstype); } elsif ($env{'form.state'} eq 'done') { - &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, - $permission). - &Apache::loncommon::end_page()); + $permission,$crstype)); } else { $r->print(&header(). - ''.&mt('You do not have permission to modify dates or sections for users').''. - &Apache::loncommon::end_page()); + ''.&mt('You do not have permission to modify dates or sections for users').''); } } elsif ($env{'form.action'} eq 'selfenroll') { - $r->print(&header()); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=selfenroll', - text=>"Configure Self-enrollment"}); + push(@{$brcrum}, + {href => '/adm/createuser?action=selfenroll', + text => "Configure Self-enrollment", + help => 'Course_Self_Enrollment'}); if (!exists($env{'form.state'})) { - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Configure Self-enrollment', - 'Course_Self_Enrollment')); + $args = { bread_crumbs => $brcrum, + bread_crumbs_component => 'Configure Self-enrollment'}; + $r->print(&header(undef,$args)); $r->print('

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

'."\n"); &print_selfenroll_menu($r,$context,$permission); } elsif ($env{'form.state'} eq 'done') { - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=selfenroll', - text=>"Result"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Self-enrollment result', - 'Course_Self_Enrollment')); + push (@{$brcrum}, + {href=>'/adm/createuser?action=selfenroll', + text=>"Result"}); + $args = { bread_crumbs => $brcrum, + bread_crumbs_component => 'Self-enrollment result'}; + $r->print(&header(undef,$args)); $r->print('

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

'."\n"); &update_selfenroll_config($r,$context,$permission); } - $r->print(&Apache::loncommon::end_page()); } elsif ($env{'form.action'} eq 'selfenrollqueue') { - $r->print(&header()); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=selfenrollqueue', - text=>"Enrollment requests"}); + push(@{$brcrum}, + {href => '/adm/createuser?action=selfenrollqueue', + text => 'Enrollment requests', + help => 'Course_Self_Enrollment'}); + $bread_crumbs_component = 'Enrollment requests'; + if ($env{'form.state'} eq 'done') { + push(@{$brcrum}, + {href => '/adm/createuser?action=selfenrollqueue', + text => 'Result', + help => 'Course_Self_Enrollment'}); + $bread_crumbs_component = 'Enrollment result'; + } + $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); my $cid = $env{'request.course.id'}; my $cdom = $env{'course.'.$cid.'.domain'}; my $cnum = $env{'course.'.$cid.'.num'}; my $coursedesc = $env{'course.'.$cid.'.description'}; if (!exists($env{'form.state'})) { - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment requests', - 'Course_SelfEnrollment_Approval')); $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', - text=>"Result"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('Enrollment result', - 'Course_Self_Enrollment')); $r->print('

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

'."\n"); $r->print(&Apache::loncoursequeueadmin::update_request_queue($context, $cdom,$cnum,$coursedesc)); } - $r->print(&Apache::loncommon::end_page()); } elsif ($env{'form.action'} eq 'changelogs') { - $r->print(&header()); - &Apache::lonhtmlcommon::add_breadcrumb - ({href=>'/adm/createuser?action=changelogs', - text=>"User Management Logs"}); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Changes', - 'Course_User_Logs')); - &print_userchangelogs_display($r,$context,$permission); - $r->print(&Apache::loncommon::end_page()); + push (@{$brcrum}, + {href => '/adm/createuser?action=changelogs', + text => 'User Management Logs', + help => 'Course_User_Logs'}); + $bread_crumbs_component = 'User Changes'; + $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); + &print_userchangelogs_display($r,$context,$permission); } else { - $r->print(&header()); - $r->print(&Apache::lonhtmlcommon::breadcrumbs('User Management')); - $r->print(&print_main_menu($permission,$context)); - $r->print(&Apache::loncommon::end_page()); + $args = { bread_crumbs => $brcrum, + bread_crumbs_component => $bread_crumbs_component}; + $r->print(&header(undef,$args)); + $r->print(&print_main_menu($permission,$context,$crstype)); } + $r->print(&Apache::loncommon::end_page()); return OK; } sub header { - my ($jscript,$loaditems,$args) = @_; + my ($jscript,$args) = @_; + my $title = 'User Management'; + my $is_custom = &Apache::loncommon::needs_gci_custom(); + if ($env{'request.course.id'}) { + if ($is_custom) { + $title = 'Enrollment and Student Activity'; + } + } my $start_page; - if (ref($loaditems) eq 'HASH') { - $start_page=&Apache::loncommon::start_page('User Management',$jscript,{'add_entries' => $loaditems}); + if (ref($args) eq 'HASH') { + $start_page=&Apache::loncommon::start_page($title,$jscript,$args); } else { - $start_page=&Apache::loncommon::start_page('User Management',$jscript,$args); + $start_page=&Apache::loncommon::start_page($title,$jscript); } return $start_page; } @@ -4038,7 +4439,17 @@ END ############################################################### # Menu Phase One sub print_main_menu { - my ($permission,$context) = @_; + my ($permission,$context,$crstype) = @_; + my $is_custom = &Apache::loncommon::needs_gci_custom(); + if (($context eq 'course') && ($is_custom)) { + return &print_gci_main_menu($permission,$context,$crstype) + } + my $linkcontext = $context; + my $stuterm = lc(&Apache::lonnet::plaintext('st',$crstype)); + if (($context eq 'course') && ($crstype eq 'Community')) { + $linkcontext = lc($crstype); + $stuterm = 'Members'; + } my %links = ( domain => { upload => 'Upload a File of Users', @@ -4055,17 +4466,40 @@ sub print_main_menu { 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 %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{$context}{'singleuser'}, + linktext => $links{$linkcontext}{'singleuser'}, icon => 'edit-redo.png', #help => 'Course_Change_Privileges', url => '/adm/createuser?action=singleuser', permission => $permission->{'cusr'}, - linktitle => 'Add a user with a certain role to this course.', + linktitle => $linktitles{$linkcontext}{'singleuser'}, }, ]}, @@ -4073,7 +4507,7 @@ sub print_main_menu { items => [ { - linktext => $links{$context}{'upload'}, + linktext => $links{$linkcontext}{'upload'}, icon => 'sctr.png', #help => 'Course_Create_Class_List', url => '/adm/createuser?action=upload', @@ -4081,12 +4515,12 @@ sub print_main_menu { linktitle => 'Upload a CSV or a text file containing users.', }, { - linktext => $links{$context}{'listusers'}, + linktext => $links{$linkcontext}{'listusers'}, icon => 'edit-find.png', #help => 'Course_View_Class_List', url => '/adm/createuser?action=listusers', permission => ($permission->{'view'} || $permission->{'cusr'}), - linktitle => 'Show and manage users of this course.', + linktitle => $linktitles{$linkcontext}{'listusers'}, }, ]}, @@ -4110,26 +4544,52 @@ sub print_main_menu { }elsif ($context eq 'course'){ my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); - + + 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 => 'Add/Modify a Student', + linktext => $linktext{$crstype}{'single'}, #help => 'Course_Add_Student', icon => 'list-add.png', url => '/adm/createuser?action=singlestudent', permission => $permission->{'cusr'}, - linktitle => 'Add a user with the role student to this course.', + linktitle => $linktitle{$crstype}{'single'}, }, ); push(@{ $menu[1]->{items} }, #Category: Multiple Users { - linktext => 'Drop Students', + linktext => $linktext{$crstype}{'drop'}, icon => 'edit-undo.png', #help => 'Course_Drop_Student', url => '/adm/createuser?action=drop', permission => $permission->{'cusr'}, - linktitle =>'Remove a student from this course.', + linktitle => $linktitle{$crstype}{'drop'}, }, ); push(@{ $menu[2]->{items} }, #Category: Administration @@ -4142,15 +4602,15 @@ sub print_main_menu { linktitle => 'Configure a custom role.', }, { - linktext => 'Course Groups', + linktext => $linktext{$crstype}{'groups'}, icon => 'conf.png', #help => 'Course_Manage_Group', url => '/adm/coursegroups?refpage=cusr', permission => $permission->{'grp_manage'}, - linktitle => 'Manage course groups.', + linktitle => $linktitle{$crstype}{'groups'}, }, { - linktext => 'Change Logs', + linktext => 'Change Log', icon => 'document-properties.png', #help => 'Course_User_Logs', url => '/adm/createuser?action=changelogs', @@ -4172,17 +4632,20 @@ sub print_main_menu { } if (!exists($permission->{'cusr_section'})){ - - push(@{ $menu[2]->{items} }, - { - linktext => 'Automated Enrollment', - icon => 'roles.png', - #help => 'Course_Automated_Enrollment', - permission => (&Apache::lonnet::auto_run($cnum,$cdom) - && $permission->{'cusr'}), - url => '/adm/populate', - linktitle => 'Automated enrollment manager.', - }, + if ($crstype ne 'Community') { + push(@{ $menu[2]->{items} }, + { + linktext => 'Automated Enrollment', + icon => 'roles.png', + #help => 'Course_Automated_Enrollment', + permission => (&Apache::lonnet::auto_run($cnum,$cdom) + && $permission->{'cusr'}), + url => '/adm/populate', + linktitle => 'Automated enrollment manager.', + } + ); + } + push(@{ $menu[2]->{items} }, { linktext => 'User Self-Enrollment', icon => 'cstr.png', @@ -4192,7 +4655,6 @@ sub print_main_menu { linktitle => 'Configure user self-enrollment.', }, ); - } }; return Apache::lonhtmlcommon::generate_menu(@menu); @@ -4203,6 +4665,82 @@ return Apache::lonhtmlcommon::generate_m # }); } +sub print_gci_main_menu { + my ($permission,$context,$crstype) = @_; + my $stuterm = lc(&Apache::lonnet::plaintext('st',$crstype)); + my ($cnum,$cdom) = &Apache::lonuserutils::get_course_identity(); + my %links = ( + course => { + single => 'Add/Modify a Student', + drop => 'Drop Students', + upload => 'Upload a File of Course Users', + singleuser => 'Add/Modify a Course User', + listusers => 'Concept Test Roster and Student Activity', + }, + ); + my %linktitles = ( + course => { + singleuser => 'Add a user with a certain role to this course.', + listusers => 'Show and manage users in this course.', + single => 'Add a user with the role of student to this course', + drop => 'Remove a student from this course.', + upload => 'Upload a CSV or a text file containing users.', + }, + ); + my @menu = ( {categorytitle => 'Manage Users', + items => + [ + { + linktext => $links{$context}{'single'}, + #help => 'Course_Add_Student', + icon => 'list-add.png', + url => '/adm/createuser?action=singlestudent', + permission => $permission->{'cusr'}, + linktitle => $linktitles{$context}{'single'}, + + }, + { + linktext => $links{$context}{'drop'}, + icon => 'edit-undo.png', + #help => 'Course_Drop_Student', + url => '/adm/createuser?action=drop', + permission => $permission->{'cusr'}, + linktitle => $linktitles{$context}{'drop'}, + }, + { + linktext => $links{$context}{'upload'}, + icon => 'sctr.png', + #help => 'Course_Create_Class_List', + url => '/adm/createuser?action=upload', + permission => $permission->{'cusr'}, + linktitle => $linktitles{$context}{'upload'}, + }, + { + linktext => $links{$context}{'listusers'}, + icon => 'edit-find.png', + #help => 'Course_View_Class_List', + url => '/adm/createuser?action=listusers', + permission => ($permission->{'view'} || $permission->{'cusr'}), + linktitle => $linktitles{$context}{'listusers'}, + }, + ]}, + {categorytitle => 'Administration', + items => [ ]}, + ); + + push(@{ $menu[1]->{items} }, #Category: Administration + { + linktext => 'Change Log', + icon => 'document-properties.png', + #help => 'Course_User_Logs', + url => '/adm/createuser?action=changelogs', + permission => $permission->{'cusr'}, + linktitle => 'View change log.', + }, + ); + return Apache::lonhtmlcommon::generate_menu(@menu); +} + sub restore_prev_selections { my %saveable_parameters = ('srchby' => 'scalar', 'srchin' => 'scalar', @@ -4216,6 +4754,7 @@ sub restore_prev_selections { sub print_selfenroll_menu { my ($r,$context,$permission) = @_; + my $crstype = &Apache::loncommon::course_type(); my $formname = 'enrollstudent'; my $nolink = 1; my ($row,$lt) = &get_selfenroll_titles(); @@ -4577,8 +5116,12 @@ ENDSCRIPT &mt('No').''; my %advhash = &Apache::lonnet::get_course_adv_roles($cid,1); my (@ccs,%notified); - if ($advhash{'cc'}) { - @ccs = split(/,/,$advhash{'cc'}); + my $ccrole = 'cc'; + if ($crstype eq 'Community') { + $ccrole = 'co'; + } + if ($advhash{$ccrole}) { + @ccs = split(/,/,$advhash{$ccrole}); } if ($currnotified) { foreach my $current (split(/,/,$currnotified)) { @@ -4883,10 +5426,10 @@ sub print_userchangelogs_display { my $formname = 'roleslog'; my $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; my $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; + my $crstype = &Apache::loncommon::course_type(); my %roleslog=&Apache::lonnet::dump('nohist_rolelog',$cdom,$cnum); if ((keys(%roleslog))[0]=~/^error\:/) { undef(%roleslog); } - $r->print(''); my %saveable_parameters = ('show' => 'scalar',); &Apache::loncommon::store_course_settings('roles_log', \%saveable_parameters); @@ -4921,7 +5464,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)); my ($minshown,$maxshown); $minshown = 1; my $count = 0; @@ -4932,8 +5474,29 @@ sub print_userchangelogs_display { } } - # Collect user change log data - my $content = ''; + # 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() + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .'' + .&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'})); @@ -4955,7 +5518,14 @@ sub print_userchangelogs_display { } $count ++; next if ($count < $minshown); - + 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'}} = &Apache::loncommon::plainname($roleslog{$id}{'exe_uname'},$roleslog{$id}{'exe_udom'}); @@ -4990,45 +5560,49 @@ sub print_userchangelogs_display { if ($roleslog{$id}{'logentry'}{'selfenroll'}) { $chgcontext = 'selfenroll'; } - my %lt = &rolechg_contexts(); + my %lt = &rolechg_contexts($crstype); if ($chgcontext ne '' && $lt{$chgcontext} ne '') { $chgcontext = $lt{$chgcontext}; } - $content .= + $r->print( &Apache::loncommon::start_data_table_row() .'' .'' .'' .'' - .'' + .'' .'' .'' .'' .'' - .&Apache::loncommon::end_data_table_row(); + .&Apache::loncommon::end_data_table_row()."\n"); } - # Form Footer - my $form_footer = - '' - .'' - .''; - - # Only display table, if content is available (has been collected above) - if (!$content) { + 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.') .'

' ); - $r->print($form_footer); - return; } - # Content to display, so create navigation and display table + # Form Footer + $r->print( + '' + .'' + .''); + return; +} - # Create Navigation: - # Navigation Script - my $nav_script = <<"ENDSCRIPT"; +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 - my $nav_links; - $nav_links = '

'; - if (($curr{'page'} > 1) || ($more_records)) { - if ($curr{'page'} > 1) { - $nav_links .= ' '; - } - if ($more_records) { - $nav_links .= ''; + # Navigation Buttons + $nav_links = '

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

'; } - $nav_links .= '

'; - - # Table Header - my $tableheader = - &Apache::loncommon::start_data_table_header_row() - .'' - .'' - .'' - .'' - .'' - .'' - .'' - .'' - .'' - .&Apache::loncommon::end_data_table_header_row(); - - # Print Content - $r->print( - $nav_script - .$nav_links - .&Apache::loncommon::start_data_table() - .$tableheader - .$content - .&Apache::loncommon::end_data_table() - .$nav_links - .$form_footer - ); - return; + return ($nav_script,$nav_links); } sub role_display_filter { - my ($formname,$cdom,$cnum,$curr,$version) = @_; + my ($formname,$cdom,$cnum,$curr,$version,$crstype) = @_; my $context = 'course'; + my $lctype = lc($crstype); my $nolink = 1; my $output = '
$lt{'usr'}:  $lt{'dom'}:$domform  $sellink   '; - my $active=1; - $active=0 if (($role_end_time) && ($now>$role_end_time)); - if (($active) && ($allowed)) { - $row.= ''; + if ($role_code eq 'ca' || $role_code eq 'au') { + $class='Construction Space'; + } elsif ($role_code eq 'su') { + $class='System'; } else { - if ($active) { - $row.=' '; - } else { - $row.=&mt('expired or revoked'); - } + $class='Domain'; } - $row.=''; - if ($allowed && !$active) { - $row.= ''; + } + if (($role_code eq 'ca') || ($role_code eq 'aa')) { + $area=~m{/($match_domain)/($match_username)}; + if (&Apache::lonuserutils::authorpriv($2,$1)) { + $allowed=1; } else { - $row.=' '; + $allowed=0; } - $row.=''; - if ($delallowed) { - $row.= ''; + } + my $row = ''; + $row.= ''; + my $active=1; + $active=0 if (($role_end_time) && ($now>$role_end_time)); + if (($active) && ($allowed)) { + $row.= ''; + } else { + if ($active) { + $row.=' '; } else { - $row.=' '; + $row.=&mt('expired or revoked'); } - my $plaintext=''; - if (!$croletitle) { - $plaintext=&Apache::lonnet::plaintext($role_code,$class) - } else { - $plaintext= + } + $row.=''; + 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?&Apache::lonlocal::locallocaltime($role_start_time) - : ' ' ). - ''.($role_end_time ?&Apache::lonlocal::locallocaltime($role_end_time) - : ' ' ) - ."
".&mt($type)."
'.$plaintext. + ''.$area. + ''.($role_start_time?&Apache::lonlocal::locallocaltime($role_start_time) + : ' ' ). + ''.($role_end_time ?&Apache::lonlocal::locallocaltime($role_end_time) + : ' ' ) + ."
".&mt($type)."
'.$lt{'rev'}.''.$lt{'ren'}.''.$lt{'del'}. ''.$lt{'rol'}.''.$lt{'ext'}. ''.$lt{'sta'}.''.$lt{'end'}.''.$lt{'prv'}.''.$lt{'crl'}.''.$lt{'dml'}. ''.$lt{'ssl'}.''.$privtext.''. ($courselevel{$priv}?''. ($domainlevel{$priv}?'':' '). - ''. - ($systemlevel{$priv}?'':' '). - ''); + if ($priv eq 'bre' && $crstype eq 'Community') { + $r->print(' '); + } else { + $r->print($systemlevel{$priv}?'':' '); + } + $r->print('
 '.&mt('When').''.&mt('Who made the change').''.&mt('Changed User').''.&mt('Role').''.&mt('Section').''.&mt('Context').''.&mt('Start').''.&mt('End').''.$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'}).''.&Apache::lonnet::plaintext($roleslog{$id}{'logentry'}{'role'},$crstype).''.$sec.''.$chgcontext.''.$rolestart.''.$roleend.' '.&mt('When').''.&mt('Who made the change').''.&mt('Changed User').''.&mt('Role').''.&mt('Section').''.&mt('Context').''.&mt('Start').''.&mt('End').'
'; $otheritems .= < + - ENDTIMEENTRY @@ -6211,6 +6762,21 @@ sub get_selfenroll_titles { return (\@row,\%lt); } +sub is_courseowner { + my ($thiscourse,$courseowner) = @_; + if ($courseowner eq '') { + if ($env{'request.course.id'} eq $thiscourse) { + $courseowner = $env{'course.'.$env{'request.course.id'}.'.internal.courseowner'}; + } + } + if ($courseowner ne '') { + if ($courseowner eq $env{'user.name'}.':'.$env{'user.domain'}) { + return 1; + } + } + return; +} + #---------------------------------------------- end functions for &phase_two #--------------------------------- functions for &phase_two and &phase_three
'. ''.&mt('Changes/page:').'
'. @@ -5108,7 +5657,7 @@ sub role_display_filter { &Apache::lonhtmlcommon::date_setter($formname,'rolelog_end_date', $curr->{'rolelog_end_date'},undef, undef,undef,undef,undef,undef,undef,$nolink); - my %lt = &rolechg_contexts(); + my %lt = &rolechg_contexts($crstype); $output .= '
'.&mt('Window during which changes occurred:').'
'. ''. @@ -5122,13 +5671,13 @@ sub role_display_filter { $output .= ' selected="selected"'; } $output .= '>'.&mt('Any').''."\n"; - my @roles = &Apache::lonuserutils::course_roles($context,undef,1); + my @roles = &Apache::lonuserutils::course_roles($context,undef,1,$lctype); foreach my $role (@roles) { my $plrole; if ($role eq 'cr') { $plrole = &mt('Custom Role'); } else { - $plrole=&Apache::lonnet::plaintext($role); + $plrole=&Apache::lonnet::plaintext($role,$crstype); } my $selstr = ''; if ($role eq $curr->{'role'}) { @@ -5140,7 +5689,7 @@ sub role_display_filter { ''. ''."\n". ' '."\n". ' '."\n"; - if ($role eq 'cc') { + if (($role eq 'cc') || ($role eq 'co')) { $row .= ''; } elsif ($env{'request.course.sec'} ne '') { $row .= ' '. &Apache::loncommon::end_data_table_header_row(); my $otheritems = &Apache::loncommon::start_data_table_row()."\n". - ''."\n". - ''."\n". + ''. + ''. + ''. '
'.&mt('After:'). ''.$startform.'
  '. &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; } sub rolechg_contexts { + my ($crstype) = @_; my %lt = &Apache::lonlocal::texthash ( any => 'Any', auto => 'Automated enrollment', @@ -5178,8 +5719,13 @@ sub rolechg_contexts { course => 'User Management in course', domain => 'User Management in domain', selfenroll => 'Self-enrolled', - requestcourses => 'Course Request', + requestcourses => 'Course Request', ); + if ($crstype eq 'Community') { + $lt{'createcourse'} = &mt('Community Creation'); + $lt{'course'} = &mt('User Management in community'); + $lt{'requestcourses'} = &mt('Community Request'); + } return %lt; } @@ -5209,7 +5755,7 @@ sub user_search_result { if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'instd')) { if (($srch->{'srchdomain'} eq '') || ! (&Apache::lonnet::domain($srch->{'srchdomain'}))) { - $response = &mt('You must specify a valid domain when searching in a domain or institutional directory.') + $response = '

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

'; } } if (($srch->{'srchin'} eq 'dom') || ($srch->{'srchin'} eq 'crs') || @@ -5222,7 +5768,7 @@ sub user_search_result { } } if ($unamecheck !~ /^$match_username$/) { - $response = &mt('You must specify a valid username. Only the following are allowed: letters numbers - . @'); + $response = '

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

'; } } } @@ -5397,7 +5943,8 @@ sub user_search_result { ($currstate,$response,$forcenewuser) = &build_search_response($context,$srch,%srch_results); } else { - my $showdom = &display_domain_info($srch->{'srchdomain'}); $response = ''. + my $showdom = &display_domain_info($srch->{'srchdomain'}); + $response = ''. &mt('Institutional directory search is not available in domain: [_1]',$showdom). '
'. &mt('You may want to search in the LON-CAPA domain instead of the institutional directory.'). @@ -5690,12 +6237,13 @@ sub course_level_table { 'end' => "End" ); - foreach my $protectedcourse (sort( keys(%inccourses))) { + foreach my $protectedcourse (sort(keys(%inccourses))) { my $thiscourse=$protectedcourse; $thiscourse=~s:_:/:g; my %coursedata=&Apache::lonnet::coursedescription($thiscourse); + my $isowner = &is_courseowner($protectedcourse,$coursedata{'internal.courseowner'}); my $area=$coursedata{'description'}; - my $type=$coursedata{'type'}; + my $crstype=$coursedata{'type'}; if (!defined($area)) { $area=&mt('Unavailable course').': '.$protectedcourse; } my ($domain,$cnum)=split(/\//,$thiscourse); my %sections_count; @@ -5705,12 +6253,13 @@ sub course_level_table { &Apache::loncommon::get_sections($domain,$cnum); } } - my @roles = &Apache::lonuserutils::roles_by_context('course'); + my @roles = &Apache::lonuserutils::roles_by_context('course','',$crstype); foreach my $role (@roles) { - my $plrole=&Apache::lonnet::plaintext($role); - if (&Apache::lonnet::allowed('c'.$role,$thiscourse)) { + my $plrole=&Apache::lonnet::plaintext($role,$crstype); + if ((&Apache::lonnet::allowed('c'.$role,$thiscourse)) || + ((($role eq 'cc') || ($role eq 'co')) && ($isowner))) { $table .= &course_level_row($protectedcourse,$role,$area,$domain, - $plrole,\%sections_count,\%lt); + $plrole,\%sections_count,\%lt); } elsif ($env{'request.course.sec'} ne '') { if (&Apache::lonnet::allowed('c'.$role,$thiscourse.'/'. $env{'request.course.sec'})) { @@ -5720,7 +6269,8 @@ sub course_level_table { } } if (&Apache::lonnet::allowed('ccr',$thiscourse)) { - foreach my $cust (sort keys %customroles) { + foreach my $cust (sort(keys(%customroles))) { + next if ($crstype eq 'Community' && $customroles{$cust} =~ /bre\&S/); my $role = 'cr_cr_'.$env{'user.domain'}.'_'.$env{'user.name'}.'_'.$cust; $table .= &course_level_row($protectedcourse,$role,$area,$domain, $cust,\%sections_count,\%lt); @@ -5751,7 +6301,7 @@ sub course_level_row { $protectedcourse.'_'.$role.'" />
'.$plrole.''.$area.'
Domain: '.$domain.'
 '. ''; my $courseform=''.&Apache::loncommon::selectcourse_link - ('cu','dccourse','dcdomain','coursedesc',undef,undef,'Course').''; - my $cb_jscript = &Apache::loncommon::coursebrowser_javascript($dcdom,'currsec','cu'); + ('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", 'grs' => "Section", @@ -5811,14 +6361,14 @@ sub course_level_dc { 'ssd' => "Set Start Date", 'sed' => "Set End Date" ); - my $header = '

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

'. + my $header = '

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

'. &Apache::loncommon::start_data_table(). &Apache::loncommon::start_data_table_header_row(). '
'.$courseform.''.$lt{'rol'}.''.$lt{'grs'}.''.$lt{'sta'}.''.$lt{'end'}.'

 '.$lt{'new'}.'
'. ''. ''. - '

$lt{'ssd'}
+
$lt{'sed'}