--- loncom/auth/lonroles.pm 2009/05/18 17:30:34 1.224 +++ loncom/auth/lonroles.pm 2010/12/05 16:15:02 1.240.2.19 @@ -1,7 +1,7 @@ # The LearningOnline Network with CAPA # User Roles Screen # -# $Id: lonroles.pm,v 1.224 2009/05/18 17:30:34 raeburn Exp $ +# $Id: lonroles.pm,v 1.240.2.19 2010/12/05 16:15:02 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -138,6 +138,7 @@ use Apache::lonannounce; use Apache::lonlocal; use Apache::lonpageflip(); use Apache::lonnavdisplay(); +use Apache::loncoursequeueadmin; use GDBM_File; use LONCAPA qw(:DEFAULT :match); use HTML::Entities; @@ -157,8 +158,14 @@ sub redirect_user { } else { $navwindow.=&Apache::lonnavmaps::close(); } + + # Breadcrumbs + my $brcrum = [{'href' => $url, + 'text' => 'Switching Role'},]; my $start_page = &Apache::loncommon::start_page('Switching Role',undef, - {'redirect' => [1,$url],}); + {'redirect' => [1,$url], + 'bread_crumbs' => $brcrum,}); + &Apache::lonhtmlcommon::clear_breadcrumbs(); my $end_page = &Apache::loncommon::end_page(); # Note to style police: @@ -167,7 +174,9 @@ sub redirect_user { $r->print(< +// $navwindow

$msg

@@ -182,13 +191,25 @@ sub error_page { &Apache::loncommon::no_cache($r); $r->send_http_header; return OK if $r->header_only; - $r->print(&Apache::loncommon::start_page('Problems during Course Initialization'). - ''. - '

'.&mt('The following problems occurred:'). + # Breadcrumbs + my $brcrum = [{'href' => $dest, + 'text' => 'Problems during Course Initialization'},]; + $r->print(&Apache::loncommon::start_page('Problems during Course Initialization', + undef, + {'bread_crumbs' => $brcrum,}) + ); + $r->print( + ''. + '

'.&mt('The following problems occurred:'). + '
'. $error. - '


'.&mt('Continue').''. - &Apache::loncommon::end_page()); + '


'.&mt('Continue').'' + ); + $r->print(&Apache::loncommon::end_page()); } sub handler { @@ -197,10 +218,15 @@ sub handler { my $now=time; my $then=$env{'user.login.time'}; + my $refresh=$env{'user.refresh.time'}; + if (!$refresh) { + $refresh = $then; + } my $envkey; my %dcroles = (); my $numdc = &check_fordc(\%dcroles,$then); &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}); + my $custommenu = &Apache::loncommon::needs_gci_custom(); # ================================================================== Roles Init if ($env{'form.selectrole'}) { @@ -215,7 +241,7 @@ sub handler { # Check if user is CC trying to select a course role if ($env{'form.switchrole'}) { if (!defined($env{'user.role.'.$env{'form.switchrole'}})) { - &adhoc_course_role($then); + &adhoc_course_role($refresh,$then); } } my %temp=('logout_'.$env{'request.course.id'} => time); @@ -232,12 +258,12 @@ sub handler { # Check if user is a DC trying to enter a course or author space and needs privs to be created if ($numdc > 0) { foreach my $envkey (keys %env) { -# Is this an ad-hoc CC-role? - if (my ($domain,$coursenum) = - ($envkey =~ m-^form\.cc\./($match_domain)/($match_courseid)$-)) { +# Is this an ad-hoc Coordinator role? + if (my ($ccrole,$domain,$coursenum) = + ($envkey =~ m-^form\.(cc|co)\./($match_domain)/($match_courseid)$-)) { if ($dcroles{$domain}) { &Apache::lonnet::check_adhoc_privs($domain,$coursenum, - $then,$now,'cc'); + $then,$refresh,$now,$ccrole); } last; } @@ -278,7 +304,7 @@ sub handler { my ($server_status,$home) = &check_author_homeserver($user,$domain); if (($server_status eq 'ok') || ($server_status eq 'switchserver')) { &Apache::lonnet::check_adhoc_privs($domain,$user,$then, - $now,'ca'); + $refresh,$now,'ca'); if ($server_status eq 'switchserver') { my $trolecode = 'ca./'.$domain.'/'.$user; my $switchserver = '/adm/switchserver?' @@ -295,11 +321,13 @@ sub handler { } } } - + if (($env{'form.cm'}) && ($env{'form.orgurl'})) { + $r->internal_redirect($env{'form.orgurl'}); + } foreach $envkey (keys %env) { next if ($envkey!~/^user\.role\./); my ($where,$trolecode,$role,$tstatus,$tend,$tstart); - &Apache::lonnet::role_status($envkey,$then,$now,\$role,\$where, + &Apache::lonnet::role_status($envkey,$then,$refresh,$now,\$role,\$where, \$trolecode,\$tstatus,\$tstart,\$tend); if ($env{'form.'.$trolecode}) { if ($tstatus eq 'is') { @@ -367,9 +395,11 @@ sub handler { $r->print(< +// -
+ $message
@@ -390,9 +420,11 @@ ENDENTEREDKEY $r->print(< +// - + @@ -418,8 +450,16 @@ ENDENTERKEY if (($cnum) && ($role ne 'ca') && ($role ne 'aa')) { my $msg; + if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; } + &Apache::lonnet::appenv({'request.role.adv'=>$tadv}); my ($furl,$ferr)= &Apache::lonuserstate::readmap($cdom.'/'.$cnum); + if ($custommenu) { + unless (($ferr) || ($env{'form.switchrole'})) { + &Apache::lonnet::put('nohist_crslastlogin',{$env{'user.name'}.':'.$env{'user.domain'}.':'.$csec.':'.$role => $now}, + $cdom,$cnum); + } + } if (($env{'form.orgurl'}) && ($env{'form.orgurl'}!~/^\/adm\/flip/)) { my $dest=$env{'form.orgurl'}; @@ -431,8 +471,6 @@ ENDENTERKEY } $dest .= 'symb='.$env{'form.symb'}; } - if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; } - &Apache::lonnet::appenv({'request.role.adv'=>$tadv}); if (($ferr) && ($tadv)) { &error_page($r,$ferr,$dest); } else { @@ -451,8 +489,6 @@ ENDENTERKEY .'

'.&mt('Please try again.').'

' .'

'.$ferr.'

'; } - if (&Apache::lonnet::allowed('adv') eq 'F') { $tadv=1; } - &Apache::lonnet::appenv({'request.role.adv'=>$tadv}); if (($ferr) && ($tadv)) { &error_page($r,$ferr,$furl); @@ -464,8 +500,8 @@ ENDENTERKEY $courseid = substr($courseid, 1); } $courseid =~ s/\//_/; - if ($role eq 'cc' && $env{'course.' . $courseid . - '.course.helper.not.run'}) { + if (($cdom ne 'gcitest') && (($role eq 'cc') || ($role eq 'co')) + && ($env{'course.' . $courseid .'.course.helper.not.run'})) { $furl = "/adm/helper/course.initialization.helper"; # Send the user to the course they selected } elsif ($env{'request.course.id'}) { @@ -488,7 +524,7 @@ ENDENTERKEY .$env{'request.course.sec'}) ) { my $startpage = &courseloadpage($courseid); - unless ($startpage eq 'firstres') { + unless (($startpage eq 'firstres') || ($cdom eq 'gcitest')) { $msg = &mt('Entering [_1] ...', $env{'course.'.$courseid.'.description'}); &redirect_user($r,&mt('New in course'), @@ -503,6 +539,9 @@ ENDENTERKEY # Guess not ... $furl=&Apache::lonpageflip::first_accessible_resource(); } + if (($cdom eq 'gcitest') && ($custommenu)) { + $furl = '/adm/navmaps'; + } $msg = &mt('Entering [_1] ...', $env{'course.'.$courseid.'.description'}); &redirect_user($r,&mt('Entering [_1]', @@ -545,7 +584,6 @@ ENDENTERKEY } } - # =============================================================== No Roles Init &Apache::loncommon::content_type($r,'text/html'); @@ -553,29 +591,48 @@ ENDENTERKEY $r->send_http_header; return OK if $r->header_only; - my $crumbtext = 'User Roles'; - my $pagetitle = 'My Roles'; - my $recent = &mt('Recent Roles'); - my $show_course=&Apache::loncommon::show_course(); - if ($show_course) { - $crumbtext = 'Courses'; - $pagetitle = 'My Courses'; - $recent = &mt('Recent Courses'); - } - my $brcrum =[{href=>"/adm/roles",text=>$crumbtext}]; - my $swinfo=&Apache::lonmenu::rawconfig(); - my $start_page=&Apache::loncommon::start_page($pagetitle,undef,{bread_crumbs=>$brcrum}); - my $standby=&mt('Role selected. Please stand by.'); - $standby=~s/\n/\\n/g; - my $noscript=''.&mt('Use of LON-CAPA requires Javascript to be enabled in your web browser.').'
'.&mt('As this is not the case, most functionality in the system will be unavailable.').'

'; - - $r->print(<'.&mt('As this is not the case, most functionality in the system will be unavailable.').'
'; + if ($custommenu) { + my $start_page = &Apache::loncommon::start_page('Main Menu'); + $r->print(<<"ENDCUSTOM"); +$start_page + +ENDCUSTOM + } else { + $crumbtext = 'User Roles'; + $pagetitle = 'My Roles'; + $recent = &mt('Recent Roles'); + my $standby=&mt('Role selected. Please stand by.'); + if ($show_course) { + $crumbtext = 'Courses'; + $pagetitle = 'My Courses'; + $recent = &mt('Recent Courses'); + $standby = &mt('Course selected. Please stand by.'); + } + my $brcrum = [{ href => '/adm/roles', + text => $crumbtext,}, + ]; + my $args; + if ($numdc) { + $args = {bread_crumbs => $brcrum}; + } else { + $args = {bread_crumbs => $brcrum, + bread_crumbs_menulink => '_nomenu'}; + } + my $start_page=&Apache::loncommon::start_page($pagetitle,undef,$args); + my $swinfo=&Apache::lonmenu::rawconfig(); + $standby=~s/\n/\\n/g; + $r->print(< ENDHEADER + } # ------------------------------------------ Get Error Message from Environment @@ -642,11 +701,12 @@ ENDHEADER if ($reinit) { $r->print( '

'. - &mt('As your session file for the course has expired, you will need to re-select the course.').'

'); + &mt('As your session file for the course or community has expired, you will need to re-select it.').''); } else { $r->print( '

'. - &mt('You need to choose another user role or enter a specific course for this function').'

'); + &mt('You need to choose another user role or enter a specific course or community for this function.'). + ''); } } } @@ -660,203 +720,114 @@ ENDHEADER if (($ENV{'REDIRECT_QUERY_STRING'}) && ($fn)) { $fn.='?'.$ENV{'REDIRECT_QUERY_STRING'}; } - $r->print(''); - $r->print(''); - $r->print(''); - $r->print(''); - } - my (%roletext,%sortrole,%roleclass); - my $countactive=0; - my $countfuture=0; - my $countwill=0; - my $inrole=0; - my $possiblerole=''; - my %futureroles; - my %roles_nextlogin; - my %timezones; - foreach $envkey (sort keys %env) { - my $button = 1; - my $switchserver=''; - my ($roletext,$roletext_end); - my $sortkey; - if ($envkey=~/^user\.role\./) { - my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); - &Apache::lonnet::role_status($envkey,$then,$now,\$role,\$where, - \$trolecode,\$tstatus,\$tstart,\$tend); - next if (!defined($role) || $role eq '' || $role =~ /^gr/); - my $timezone = &role_timezone($where,\%timezones); - $tremark=''; - $tpstart=' '; - $tpend=' '; - if ($tstart) { - $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone); - } - if ($tend) { - $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone); - } - if ($env{'request.role'} eq $trolecode) { - $tstatus='selected'; + unless ($custommenu) { + $r->print(''); + $r->print(''); + $r->print(''); + $r->print(''); + } + } + + my (%roletext,%sortrole,%roleclass,%futureroles,%timezones); + my ($countactive,$countfuture,$inrole,$possiblerole) = + &gather_roles($then,$refresh,$now,$reinit,$nochoose,\%roletext,\%sortrole,\%roleclass, + \%futureroles,\%timezones); + + $refresh = $now; + &Apache::lonnet::appenv({'user.refresh.time' => $refresh}); + if (!$countactive && !$countfuture) { + if (&Apache::loncommon::new_roles_update()) { + ($countactive,$countfuture,$inrole,$possiblerole) = + &gather_roles($then,$refresh,$now,$reinit,$nochoose,\%roletext,\%sortrole, + \%roleclass,\%futureroles,\%timezones); + } + } + if ($custommenu) { + if ($env{'form.destinationurl'} eq '/adm/gci_info') { + $r->print(&gci_info_page()). + &Apache::loncommon::end_page(); + return OK; + } + my %courses = &Apache::loncommon::existing_gcitest_courses('cc'); + $env{'browser.interface'}='faketextual'; + $env{'environment.remote'}='off'; + my $numcourses = keys(%courses); + my $switcher; + if ($numcourses > 0) { + $switcher = &Apache::loncommon::gcitest_switcher('cc',%courses); + my $current; + if ($env{'request.course.id'}) { + $current = 'cc./'.$env{'course.'.$env{'request.course.id'}.'.domain'}. + '/'.$env{'course.'.$env{'request.course.id'}.'.num'}; } - my $tbg; - if (($tstatus eq 'is') - || ($tstatus eq 'selected') - || ($tstatus eq 'will') - || ($tstatus eq 'future') - || ($env{'form.showall'})) { - if ($tstatus eq 'is') { - $tbg='LC_roles_is'; - $possiblerole=$trolecode; - $countactive++; - } elsif ($tstatus eq 'future') { - $tbg='LC_roles_future'; - $button=0; - $futureroles{$trolecode} = $tstart.':'.$tend; - $countfuture ++; - } elsif ($tstatus eq 'will') { - $tbg='LC_roles_will'; - $tremark.=&mt('Active at next login.').' '; - $roles_nextlogin{$trolecode} = $tstart.':'.$tend; - $countwill ++; - } elsif ($tstatus eq 'expired') { - $tbg='LC_roles_expired'; - $button=0; - } elsif ($tstatus eq 'will_not') { - $tbg='LC_roles_will_not'; - $tremark.=&mt('Expired after logout.').' '; - } elsif ($tstatus eq 'selected') { - $tbg='LC_roles_selected'; - $inrole=1; - $countactive++; - $tremark.=&mt('Currently selected.').' '; - } - my $trole; - if ($role =~ /^cr\//) { - my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role); - if ($tremark) { $tremark.='
'; } - $tremark.=&mt('Defined by [_1] at [_2].',$rauthor,$rdomain); - } - $trole=Apache::lonnet::plaintext($role); - my $ttype; - my $twhere; - my ($tdom,$trest,$tsection)= - split(/\//,Apache::lonnet::declutter($where)); - # First, Co-Authorship roles - if (($role eq 'ca') || ($role eq 'aa')) { - my $home = &Apache::lonnet::homeserver($trest,$tdom); - my $allowed=0; - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } - if (!$allowed) { - $button=0; - $switchserver='otherserver='.$home.'&role='.$trolecode; - } - #next if ($home eq 'no_host'); - $home = &Apache::lonnet::hostname($home); - $ttype='Construction Space'; - $twhere=&mt('User').': '.$trest.'
'.&mt('Domain'). - ': '.$tdom.'
'. - ' '.&mt('Server').': '.$home; - $env{'course.'.$tdom.'_'.$trest.'.description'}='ca'; - $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$trest.'/'); - $sortkey=$role."$trest:$tdom"; - } elsif ($role eq 'au') { - # Authors - my $home = &Apache::lonnet::homeserver - ($env{'user.name'},$env{'user.domain'}); - my $allowed=0; - my @ids=&Apache::lonnet::current_machine_ids(); - foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } - if (!$allowed) { - $button=0; - $switchserver='otherserver='.$home.'&role='.$trolecode; - } - #next if ($home eq 'no_host'); - $home = &Apache::lonnet::hostname($home); - $ttype='Construction Space'; - $twhere=&mt('Domain').': '.$tdom.'
'.&mt('Server'). - ': '.$home; - $env{'course.'.$tdom.'_'.$trest.'.description'}='ca'; - $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$env{'user.name'}.'/'); - $sortkey=$role; - } elsif ($trest) { - my $tcourseid=$tdom.'_'.$trest; - $ttype = &Apache::loncommon::course_type($tcourseid); - $trole = &Apache::lonnet::plaintext($role,$ttype); - if ($env{'course.'.$tcourseid.'.description'}) { - $twhere=$env{'course.'.$tcourseid.'.description'}; - $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; - unless ($twhere eq &mt('Currently not available')) { - $twhere.=' '. - &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). - ''; - } - } else { - my %newhash=&Apache::lonnet::coursedescription($tcourseid); - if (%newhash) { - $sortkey=$role."\0".$tdom."\0".$newhash{'description'}. - "\0".$envkey; - $twhere=$newhash{'description'}. - ' '. - &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). - ''; - $ttype = $newhash{'type'}; - $trole = &Apache::lonnet::plaintext($role,$ttype); - } else { - $twhere=&mt('Currently not available'); - $env{'course.'.$tcourseid.'.description'}=$twhere; - $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; - $ttype = 'Unavailable'; - } - } - if ($tsection) { - $twhere.='
'.&mt('Section').': '.$tsection; - } - if ($role ne 'st') { $twhere.="
".&mt('Domain').":".$tdom; } - } elsif ($tdom) { - $ttype='Domain'; - $twhere=$tdom; - $sortkey=$role.$twhere; - } else { - $ttype='System'; - $twhere=&mt('system wide'); - $sortkey=$role.$twhere; - } - ($roletext,$roletext_end) = - &build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain, - $advanced,$tremark,$tbg,$trole,$twhere,$tpstart, - $tpend,$nochoose,$button,$switchserver,$reinit); - $roletext{$envkey}=[$roletext,$roletext_end]; - if (!$sortkey) {$sortkey=$twhere."\0".$envkey;} - $sortrole{$sortkey}=$envkey; - $roleclass{$envkey}=$ttype; - } + } + $r->print(&Apache::lonmenu::inlinemenu('gcicustom',$switcher). + &Apache::loncommon::end_page()); + return OK; + } else { + if ($env{'form.destinationurl'} eq '/adm/gci_info') { + delete($env{'form.destinationurl'}); } } if ($env{'user.adv'}) { - $r->print( - '

'); + $r->print(' />'.&mt('Show all roles').'' + .' ' + .'

'); } else { if ($countactive > 0) { - &queued_selfenrollment($r); + $r->print(&Apache::loncoursequeueadmin::queued_selfenrollment()); my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); - $r->print('

'.&mt('[_1]Visit the [_2]Course Catalog[_3] to view all [_4] LON-CAPA courses.','','','',$domdesc).'
'.&mt('If a course is [_1]not[_2] in your list of current courses below, you may be able to enroll if self-enrollment is permitted.','','').'

'); + unless ($env{'user.domain'} eq 'gcitest') { + $r->print( + '

' + .&mt('[_1]Visit the [_2]Course/Community Catalog[_3]' + .' to view all [_4] LON-CAPA courses and communities.' + ,'' + ,'' + ,'',$domdesc) + .'
' + .&mt('If a course or community is [_1]not[_2] in your list of current courses and communities below,' + .' you may be able to enroll if self-enrollment is permitted.' + ,'','') + .'

' + ); + } } } # No active roles if ($countactive==0) { if ($inrole) { - $r->print('

'.&mt('Currently no additional roles or courses').'

'); + $r->print('

'.&mt('Currently no additional roles, courses or communities').'

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

'.&mt('Currently no active roles or courses').'

'); + if ($show_course) { + if ($env{'user.domain'} eq 'gcitest') { + $r->print('

'.&mt('Currently no active Concept Tests').'

'); + } elsif ($env{'user.domain'} eq 'gci') { + $r->print('

'.&mt('Currently not assigned as a GCI contributor').'

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

'.&mt('Currently no active roles, courses or communities').'

'); + } } - &findcourse_advice($r); + unless ($env{'user.domain'} eq 'gcitest') { + &findcourse_advice($r); + &requestcourse_advice($r); + } $r->print(''); if ($countfuture) { - $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture)); + if ($show_course) { + if ($env{'user.domain'} eq 'gcitest') { + $r->print(&mt('The following [quant,_1,Concept Test] will be available in the future:',$countfuture)); + } else { + $r->print(&mt('The following [quant,_1,course] will become active in the future:',$countfuture)); + } + } else { + $r->print(&mt('The following [quant,_1,role,roles] will become active in the future:',$countfuture)); + } my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole, $nochoose); &print_rolerows($r,$doheaders,\%roleclass,\%sortrole,\%dcroles, @@ -882,11 +853,40 @@ ENDHEADER } $r->print(&Apache::loncommon::end_page()); return OK; + } elsif ($countactive==1) { # Is there only one choice? + my $needs_switchserver; + if ($env{'user.author'}) { + $needs_switchserver = &check_needs_switchserver($possiblerole); + } + if ((!$needs_switchserver) && ($env{'request.role'} eq 'cm')) { + $r->print('

'.&mt('Please stand by.').'

'. + ''. + ''); + $r->print("\n"); + $r->rflush(); + $r->print(''); + $r->print(&Apache::loncommon::end_page()); + return OK; + } + if ($needs_switchserver) { + $r->print("

".&mt('Server Switch Required')."

\n". + &mt('Construction Space access is only available from '. + 'the home server of the corresponding Author.').'
'. + &mt("Click the 'Switch Server' link to go there.").'
'); + } } # ----------------------------------------------------------------------- Table - unless ((!&Apache::loncommon::show_course()) || ($nochoose) || ($countactive==1)) { + unless ((!$show_course) || ($nochoose) || ($countactive==1)) { $r->print("

".&mt('Select a Course to Enter')."

\n"); } + if ($env{'form.destinationurl'}) { + $r->print(''); + if ($env{'form.destsymb'} ne '') { + $r->print(''); + } + } my $doheaders = &roletable_headers($r,\%roleclass,\%sortrole,$nochoose); if ($env{'environment.recentroles'}) { my %recent_roles = @@ -965,18 +965,197 @@ ENDHEADER $r->print(&Apache::lonnet::getannounce()); if ($advanced) { my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); - $r->print('

' - .&mt('This is LON-CAPA [_1]',$r->dir_config('lonVersion')) - .'
' - .''.&mt('Logout').'  ' + $r->print('

' + .&mt('This LON-CAPA server is version [_1]',$r->dir_config('lonVersion')) + .'
' + .''.&mt('Logout').'  ' .'' - .&mt('Course Catalog') - .'

'); + .&mt('Course/Community Catalog') + .'

'); } $r->print(&Apache::loncommon::end_page()); return OK; } +sub gci_info_page { + return <<"END"; +
+
+

Welcome to the Geoscience Concept Inventory WebCenter

+

+Use the tabs to navigate the WebCenter and... +

    +
  • Review and comment on existing GCI questions
  • +
  • Submit GCI questions of your own
  • +
  • Create an online test for your students
  • +
  • View tutorials on creating online tests
  • +
+

+

For more information about writing and reviewing Concept Inventory questions +please refer to the GCI Workbook. +

+END +} + +sub gather_roles { + my ($then,$refresh,$now,$reinit,$nochoose,$roletext,$sortrole,$roleclass,$futureroles,$timezones) = @_; + my ($countactive,$countfuture,$inrole,$possiblerole) = (0,0,0,''); + my $advanced = $env{'user.adv'}; + my $tryagain = $env{'form.tryagain'}; + foreach my $envkey (sort(keys(%env))) { + my $button = 1; + my $switchserver=''; + my ($role_text,$role_text_end,$sortkey); + if ($envkey=~/^user\.role\./) { + my ($role,$where,$trolecode,$tstart,$tend,$tremark,$tstatus,$tpstart,$tpend); + &Apache::lonnet::role_status($envkey,$then,$refresh,$now,\$role,\$where, + \$trolecode,\$tstatus,\$tstart,\$tend); + next if (!defined($role) || $role eq '' || $role =~ /^gr/); + my $timezone = &role_timezone($where,$timezones); + $tremark=''; + $tpstart=' '; + $tpend=' '; + if ($tstart) { + $tpstart=&Apache::lonlocal::locallocaltime($tstart,$timezone); + } + if ($tend) { + $tpend=&Apache::lonlocal::locallocaltime($tend,$timezone); + } + if ($env{'request.role'} eq $trolecode) { + $tstatus='selected'; + } + my $tbg; + if (($tstatus eq 'is') + || ($tstatus eq 'selected') + || ($tstatus eq 'future') + || ($env{'form.showall'})) { + if ($tstatus eq 'is') { + $tbg='LC_roles_is'; + $possiblerole=$trolecode; + $countactive++; + } elsif ($tstatus eq 'future') { + $tbg='LC_roles_future'; + $button=0; + $futureroles->{$trolecode} = $tstart.':'.$tend; + $countfuture ++; + } elsif ($tstatus eq 'expired') { + $tbg='LC_roles_expired'; + $button=0; + } elsif ($tstatus eq 'will_not') { + $tbg='LC_roles_will_not'; + $tremark.=&mt('Expired after logout.').' '; + } elsif ($tstatus eq 'selected') { + $tbg='LC_roles_selected'; + $inrole=1; + $countactive++; + $tremark.=&mt('Currently selected.').' '; + } + my $trole; + if ($role =~ /^cr\//) { + my ($rdummy,$rdomain,$rauthor,$rrole)=split(/\//,$role); + if ($tremark) { $tremark.='
'; } + $tremark.=&mt('Defined by [_1] at [_2].',$rauthor,$rdomain); + } + $trole=Apache::lonnet::plaintext($role); + my $ttype; + my $twhere; + my ($tdom,$trest,$tsection)= + split(/\//,Apache::lonnet::declutter($where)); + # First, Co-Authorship roles + if (($role eq 'ca') || ($role eq 'aa')) { + my $home = &Apache::lonnet::homeserver($trest,$tdom); + my $allowed=0; + my @ids=&Apache::lonnet::current_machine_ids(); + foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } + if (!$allowed) { + $button=0; + $switchserver='otherserver='.$home.'&role='.$trolecode; + } + #next if ($home eq 'no_host'); + $home = &Apache::lonnet::hostname($home); + $ttype='Construction Space'; + $twhere=&mt('User').': '.$trest.'
'.&mt('Domain'). + ': '.$tdom.'
'. + ' '.&mt('Server').': '.$home; + $env{'course.'.$tdom.'_'.$trest.'.description'}='ca'; + $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$trest.'/'); + $sortkey=$role."$trest:$tdom"; + } elsif ($role eq 'au') { + # Authors + my $home = &Apache::lonnet::homeserver + ($env{'user.name'},$env{'user.domain'}); + my $allowed=0; + my @ids=&Apache::lonnet::current_machine_ids(); + foreach my $id (@ids) { if ($id eq $home) { $allowed=1; } } + if (!$allowed) { + $button=0; + $switchserver='otherserver='.$home.'&role='.$trolecode; + } + #next if ($home eq 'no_host'); + $home = &Apache::lonnet::hostname($home); + $ttype='Construction Space'; + $twhere=&mt('Domain').': '.$tdom.'
'.&mt('Server'). + ': '.$home; + $env{'course.'.$tdom.'_'.$trest.'.description'}='ca'; + $tremark.=&Apache::lonhtmlcommon::authorbombs('/res/'.$tdom.'/'.$env{'user.name'}.'/'); + $sortkey=$role; + } elsif ($trest) { + my $tcourseid=$tdom.'_'.$trest; + $ttype = &Apache::loncommon::course_type($tcourseid); + $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid); + if ($env{'course.'.$tcourseid.'.description'}) { + $twhere=$env{'course.'.$tcourseid.'.description'}; + $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; + unless ($twhere eq &mt('Currently not available')) { + $twhere.=' '. + &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). + ''; + } + } else { + my %newhash=&Apache::lonnet::coursedescription($tcourseid); + if (%newhash) { + $sortkey=$role."\0".$tdom."\0".$newhash{'description'}. + "\0".$envkey; + $twhere=$newhash{'description'}. + ' '. + &Apache::loncommon::syllabuswrapper(&mt('Syllabus'),$trest,$tdom). + ''; + $ttype = $newhash{'type'}; + $trole = &Apache::lonnet::plaintext($role,$ttype,$tcourseid); + } else { + $twhere=&mt('Currently not available'); + $env{'course.'.$tcourseid.'.description'}=$twhere; + $sortkey=$role."\0".$tdom."\0".$twhere."\0".$envkey; + $ttype = 'Unavailable'; + } + } + if ($tsection) { + $twhere.='
'.&mt('Section').': '.$tsection; + } + if ($role ne 'st') { $twhere.="
".&mt('Domain').":".$tdom; } + } elsif ($tdom) { + $ttype='Domain'; + $twhere=$tdom; + $sortkey=$role.$twhere; + } else { + $ttype='System'; + $twhere=&mt('system wide'); + $sortkey=$role.$twhere; + } + ($role_text,$role_text_end) = + &build_roletext($trolecode,$tdom,$trest,$tstatus,$tryagain, + $advanced,$tremark,$tbg,$trole,$twhere,$tpstart, + $tpend,$nochoose,$button,$switchserver,$reinit); + $roletext->{$envkey}=[$role_text,$role_text_end]; + if (!$sortkey) {$sortkey=$twhere."\0".$envkey;} + $sortrole->{$sortkey}=$envkey; + $roleclass->{$envkey}=$ttype; + } + } + } + return ($countactive,$countfuture,$inrole,$possiblerole); +} + sub role_timezone { my ($where,$timezones) = @_; my $timezone; @@ -1058,7 +1237,7 @@ sub roletable_headers { } sub roletypes { - my @types = ('Domain','Construction Space','Course','Unavailable','System'); + my @types = ('Domain','Construction Space','Course','Community','Unavailable','System'); return @types; } @@ -1120,51 +1299,67 @@ sub findcourse_advice { } else { $r->print(&mt('If you were expecting to see an active role listed for a particular course, that course may not have been created yet.').'
'); } - $r->print('

'.&mt('The [_1]Course Catalog[_2] provides information about all [_3] classes for which LON-CAPA courses have been created.','','',$domdesc).'
'); - $r->print(&mt('You can search the course catalog for courses which permit self-enrollment, if you would like to enroll in a course.').'

'); - &queued_selfenrollment($r); + my $queued = &Apache::loncoursequeueadmin::queued_selfenrollment(); + if ($queued) { + $r->print($queued); + } else { + $r->print(&mt('You have no request for contributor access pending approval by the GCI WebCenter team.').'
    '. + '
  • '.&mt('This may mean that action was taken on your request in the time since your most recent log-in.[_1]View [_2]Message[_3] to see if this is the case.','
    ','','').'
  • '. + '
  • '.&mt('If you logout and log-in again you may find you now have access to the Geoscience Concept Inventory, as a contributor.').'
  • '. + '
'); + } return; } -sub queued_selfenrollment { +sub requestcourse_advice { my ($r) = @_; - my %selfenrollrequests = &Apache::lonnet::dump('selfenrollrequests'); - my %reqs_by_date; - foreach my $item (keys(%selfenrollrequests)) { - if (ref($selfenrollrequests{$item}) eq 'HASH') { - if ($selfenrollrequests{$item}{'status'} eq 'request') { - if ($selfenrollrequests{$item}{'timestamp'}) { - push(@{$reqs_by_date{$selfenrollrequests{$item}{'timestamp'}}},$item); - } - } - } - } - if (keys(%reqs_by_date)) { - my $rolename = &Apache::lonnet::plaintext('st'); - $r->print(''.&mt('Enrollment requests pending Course Coordinator approval').'
'. - &Apache::loncommon::start_data_table(). - &Apache::loncommon::start_data_table_header_row(). - ''.&mt('Date requested').''.&mt('Course title').''. - ''.&mt('User role').''.&mt('Section').''. - &Apache::loncommon::end_data_table_header_row()); - my @sorted = sort { $a <=> $b } (keys(%reqs_by_date)); - foreach my $item (@sorted) { - if (ref($reqs_by_date{$item}) eq 'ARRAY') { - foreach my $crs (@{$reqs_by_date{$item}}) { - my %courseinfo = &Apache::lonnet::coursedescription($crs); - my $usec = $selfenrollrequests{$crs}{'section'}; - if ($usec eq '') { - $usec = &mt('No section'); + my $domdesc = &Apache::lonnet::domain($env{'user.domain'},'description'); + my $esc_dom = &HTML::Entities::encode($env{'user.domain'},'"<>&'); + my (%can_request,%request_doms); + &Apache::lonnet::check_can_request($env{'user.domain'},\%can_request,\%request_doms); + if (keys(%request_doms) > 0) { + my ($types,$typename) = &Apache::loncommon::course_types(); + if ((ref($types) eq 'ARRAY') && (ref($typename) eq 'HASH')) { + $r->print('

'.&mt('Request creation of a course or community').'

'. + '

'.&mt('You have rights to request the creation of courses and/or communities in the following domain(s):').'

    '); + my (@reqdoms,@reqtypes); + foreach my $type (sort(keys(%request_doms))) { + push(@reqtypes,$type); + if (ref($request_doms{$type}) eq 'ARRAY') { + my $domstr = join(', ',map { &Apache::lonnet::domain($_) } sort(@{$request_doms{$type}})); + $r->print( + '
  • ' + .&mt('[_1]'.$typename->{$type}.'[_2] in domain: [_3]', + '', + '', + ''.$domstr.'') + .'
  • ' + ); + foreach my $dom (@{$request_doms{$type}}) { + unless (grep(/^\Q$dom\E/,@reqdoms)) { + push(@reqdoms,$dom); + } } - $r->print(&Apache::loncommon::start_data_table_row(). - ''.&Apache::lonlocal::locallocaltime($item).''. - ''.$courseinfo{'description'}.''. - ''.$rolename.''.$usec.''. - &Apache::loncommon::end_data_table_row()); } } + my @showtypes; + foreach my $type (@{$types}) { + if (grep(/^\Q$type\E$/,@reqtypes)) { + push(@showtypes,$type); + } + } + my $requrl = '/adm/requestcourse'; + if (@reqdoms == 1) { + $requrl .= '?showdom='.$reqdoms[0]; + } + if (@showtypes > 0) { + $requrl.=(($requrl=~/\?/)?'&':'?').'crstype='.$showtypes[0]; + } + if (@reqdoms == 1 || @showtypes > 0) { + $requrl .= '&state=crstype&action=new'; + } + $r->print('
'.&mt('Use the [_1]request form[_2] to submit a request for creation of a new course or community.','','').'

'); } - $r->print(&Apache::loncommon::end_data_table()); } return; } @@ -1246,31 +1441,31 @@ sub build_roletext { } elsif ($tstatus eq 'is') { $roletext.=''. ''; } elsif ($tryagain) { $roletext.= ''. ''; } elsif ($advanced) { $roletext.= ''. ''; } elsif ($reinit) { $roletext.= ''. ''; } else { $roletext.= ''. ''; } } @@ -1347,21 +1542,22 @@ sub check_fordc { } sub adhoc_course_role { - my ($then) = @_; - my ($cdom,$cnum); + my ($refresh,$then) = @_; + my ($cdom,$cnum,$crstype); $cdom = $env{'course.'.$env{'request.course.id'}.'.domain'}; $cnum = $env{'course.'.$env{'request.course.id'}.'.num'}; - if (&check_forcc($cdom,$cnum,$then)) { + $crstype = &Apache::loncommon::course_type(); + if (&check_forcc($cdom,$cnum,$refresh,$then,$crstype)) { my $setprivs; if (!defined($env{'user.role.'.$env{'form.switchrole'}})) { $setprivs = 1; } else { my ($start,$end) = split(/\./,$env{'user.role.'.$env{'form.switchrole'}}); - if (($start && ($start>$then || $start == -1)) || + if (($start && ($start>$refresh || $start == -1)) || ($end && $end<$then)) { $setprivs = 1; } - } + } if ($setprivs) { if ($env{'form.switchrole'} =~ m-^(in|ta|ep|ad|st|cr)([\w/]*)\./\Q$cdom\E/\Q$cnum\E/?(\w*)$-) { my $role = $1; @@ -1391,7 +1587,7 @@ sub adhoc_course_role { } &Apache::lonnet::standard_roleprivs(\%newrole,$role,$cdom,$spec,$cnum,$area); &Apache::lonnet::set_userprivs(\%userroles,\%newrole,\%newgroups); - my $adhocstart = $then-1; + my $adhocstart = $refresh-1; $userroles{'user.role.'.$spec} = $adhocstart.'.'; &Apache::lonnet::appenv(\%userroles,[$role,'cm']); } @@ -1401,15 +1597,20 @@ sub adhoc_course_role { } sub check_forcc { - my ($cdom,$cnum,$then) = @_; - my $is_cc; + my ($cdom,$cnum,$refresh,$then,$crstype) = @_; + my ($is_cc,$ccrole); + if ($crstype eq 'Community') { + $ccrole = 'co'; + } else { + $ccrole = 'cc'; + } if ($cdom ne '' && $cnum ne '') { if (&Apache::lonnet::is_course($cdom,$cnum)) { - my $envkey = 'user.role.cc./'.$cdom.'/'.$cnum; + my $envkey = 'user.role.'.$ccrole.'./'.$cdom.'/'.$cnum; if (defined($env{$envkey})) { $is_cc = 1; my ($tstart,$tend)=split(/\./,$env{$envkey}); - if ($tstart && $tstart>$then) { $is_cc = 0; } + if ($tstart && $tstart>$refresh) { $is_cc = 0; } if ($tend && $tend <$then) { $is_cc = 0; } } } @@ -1422,7 +1623,7 @@ sub courselink { my $courseform=&Apache::loncommon::selectcourse_link ('rolechoice','dccourse'.$rowtype.'_'.$dcdom, 'dcdomain'.$rowtype.'_'.$dcdom,'coursedesc'.$rowtype.'_'. - $dcdom,$dcdom,undef); + $dcdom,$dcdom,undef,'Course/Community'); my $hiddenitems = ''. ''. ''. @@ -1432,11 +1633,12 @@ sub courselink { sub coursepick_jscript { my %lt = &Apache::lonlocal::texthash( - plsu => "Please use the 'Select Course' link to open a separate pick course window where you may select the course you wish to enter.", - youc => 'You can only use this screen to select courses in the current domain.', + plsu => "Please use the 'Select Course/Community' link to open a separate pick course window where you may select the course or community you wish to enter.", + youc => 'You can only use this screen to select courses and communities in the current domain.', ); my $verify_script = <<"END"; END return $verify_script; @@ -1483,9 +1686,10 @@ sub display_cc_role { my $advanced = $env{'user.adv'}; my $tryagain = $env{'form.tryagain'}; unless ($rolekey =~/^error\:/) { - if ($rolekey =~ m-^user\.role.cc\./($match_domain)/($match_courseid)$-) { - my $tcourseid = $1.'_'.$2; - my $trolecode = 'cc./'.$1.'/'.$2; + if ($rolekey =~ m{^user\.role\.(cc|co)\./($match_domain)/($match_courseid)$}) { + my $ccrole = $1; + my $tcourseid = $2.'_'.$3; + my $trolecode = $1.'./'.$2.'/'.$3; my $twhere; my $ttype; my $tbg='LC_roles_is'; @@ -1500,7 +1704,7 @@ sub display_cc_role { $twhere=&mt('Currently not available'); $env{'course.'.$tcourseid.'.description'}=$twhere; } - my $trole = &Apache::lonnet::plaintext('cc',$ttype); + my $trole = &Apache::lonnet::plaintext($ccrole,$ttype,$tcourseid); $twhere.="
".&mt('Domain').":".$1; ($roletext,$roletext_end) = &build_roletext($trolecode,$1,$2,'is',$tryagain,$advanced,'',$tbg,$trole,$twhere,'','','',1,''); } @@ -1512,21 +1716,15 @@ sub adhoc_roles_row { my ($dcdom,$rowtype) = @_; my $output = &Apache::loncommon::continue_data_table_row() .' ' - .'' - .'' - .'' - .'' - .'
' .&mt('[_1]Ad hoc[_2] roles in domain [_3] --' ,'','',$dcdom) - .''; + .' '; my $selectcclink = &courselink($dcdom,$rowtype); - my $ccrole = &Apache::lonnet::plaintext('cc'); + my $ccrole = &Apache::lonnet::plaintext('co',undef,undef,1); my $carole = &Apache::lonnet::plaintext('ca'); my $selectcalink = &coauthorlink($dcdom,$rowtype); - $output.=&mt('[_1]: [_2]',$ccrole,$selectcclink) - .'
  '.&mt('[_1]: [_2]',$carole,$selectcalink).'
' - .'' + $output.=$ccrole.': '.$selectcclink + .' | '.$carole.': '.$selectcalink .&Apache::loncommon::end_data_table_row(); return $output; }