--- loncom/interface/lonrequestcourse.pm 2009/09/10 03:00:31 1.34 +++ loncom/interface/lonrequestcourse.pm 2010/02/25 05:01:25 1.41.2.5 @@ -1,7 +1,7 @@ # The LearningOnline Network # Request a course # -# $Id: lonrequestcourse.pm,v 1.34 2009/09/10 03:00:31 raeburn Exp $ +# $Id: lonrequestcourse.pm,v 1.41.2.5 2010/02/25 05:01:25 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -52,10 +52,6 @@ described at http://www.lon-capa.org. =item onload_action() -=item check_can_request() - -=item course_types() - =item print_main_menu() =item request_administration() @@ -134,7 +130,7 @@ sub handler { } &Apache::loncommon::get_unprocessed_cgi($ENV{'QUERY_STRING'}, - ['action','showdom','cnum','state']); + ['action','showdom','cnum','state','crstype']); &Apache::lonhtmlcommon::clear_breadcrumbs(); my $dom = &get_course_dom(); my $action = $env{'form.action'}; @@ -147,6 +143,10 @@ sub handler { $states{'log'} = ['filter','display']; $states{'new'} = ['courseinfo','enrollment','personnel','review','process']; + if ($dom eq 'gcitest') { + $states{'new'} = ['courseinfo','review','process']; + } + if (($action eq 'new') && ($env{'form.crstype'} eq 'official')) { unless ($env{'form.state'} eq 'crstype') { unshift(@{$states{'new'}},'codepick'); @@ -161,7 +161,7 @@ sub handler { my @invalidcrosslist; my %trail = ( - crstype => 'Course Request Action', + crstype => 'Request Action', codepick => 'Category', courseinfo => 'Description', enrollment => 'Access Dates', @@ -173,12 +173,16 @@ sub handler { cancel => 'Cancel Request', removal => 'Outcome', ); + if ($dom eq 'gcitest') { + $trail{'crstype'} = 'Building a Test'; + $trail{'courseinfo'} = 'Test Information'; + } if (($env{'form.crstype'} eq 'official') && (&Apache::lonnet::auto_run('',$dom))) { $trail{'enrollment'} = 'Enrollment'; } - my ($page,$crumb,$newinstcode,$codechk,$checkedcode) = + my ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description) = &get_breadcrumbs($dom,$action,\$state,\%states,\%trail); if ($action eq 'display') { if (($dom eq $env{'request.role.domain'}) && (&Apache::lonnet::allowed('ccc',$dom))) { @@ -196,16 +200,30 @@ sub handler { if (($udom =~ /^$match_domain$/) && ($uname =~ /^$match_username$/)) { $result = &retrieve_settings($dom,$cnum,$udom,$uname); } else { - $warning = &mt('Invalid username or domain for course requestor'); + if ($env{'form.crstype'} eq 'community') { + $warning = &mt('Invalid username or domain for community requestor'); + } else { + $warning = &mt('Invalid username or domain for course requestor'); + } } } else { - $warning = &mt('No information was found for this course request.'); + if ($env{'form.crstype'} eq 'community') { + $warning = &mt('No information was found for this community request.'); + } else { + $warning = &mt('No information was found for this course request.'); + } } } else { $warning = &mt('No course request ID provided.'); } } else { - $warning = &mt('You do not have rights to view course request information.'); + if ($env{'form.crstype'} eq 'any') { + $warning = &mt('You do not have rights to view course or community request information.'); + } elsif ($env{'form.crstype'} eq 'community') { + $warning = &mt('You do not have rights to view community request information.'); + } else { + $warning = &mt('You do not have rights to view course request information.'); + } } } elsif ((defined($state)) && (defined($action))) { if (($action eq 'view') && ($state eq 'details')) { @@ -239,7 +257,7 @@ sub handler { $crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item}; } if ($crosslistcode ne '') { - $codechk{$i} = + ($codechk{$i}, my $rest) = &Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode); } unless ($codechk{$i} eq 'valid') { @@ -276,27 +294,29 @@ sub handler { my $loaditems = &onload_action($action,$state); - my %can_request; - my $canreq = &check_can_request($dom,\%can_request); + my (%can_request,%request_domains); + my $canreq = + &Apache::lonnet::check_can_request($dom,\%can_request,\%request_domains); if ($action eq 'new') { if ($canreq) { if ($state eq 'crstype') { &print_main_menu($r,\%can_request,\%states,$dom,$jscript,$loaditems, - $crumb); + $crumb,\%request_domains); } else { &request_administration($r,$action,$state,$page,\%states,$dom, $jscript,$loaditems,$crumb,$newinstcode, - $codechk,$checkedcode,\@invalidcrosslist); + $codechk,$checkedcode,$description, + \@invalidcrosslist); } } else { - $r->print(&header('Course Requests').$crumb. + $r->print(&header('Course/Community Requests').$crumb. '
'.&mt('Deployment of a Concept Test requires completion of the following three steps:').'
'.&mt('When assembling a test you may either:').
+ '
'.&mt('(a) have a valid test built automatically by the WebCenter, or').'
'.&mt('(b) select the questions to include by combining questions chosen from eleven bins with four mandatory questions.').'
'.&mt('The most efficient way to enroll students is to upload a text file containing usernames and passwords.').'
'.&mt("Students' full e-mail addresses should be used as their usernames to ensure uniqueness.").'
'.&mt('Request creation of a new course, or manage pending course requests.').'
'. + my @incdoms; + if (ref($request_domains) eq 'HASH') { + foreach my $item (keys(%{$request_domains})) { + if (ref($request_domains->{$item}) eq 'ARRAY') { + foreach my $possdom (@{$request_domains->{$item}}) { + unless(grep(/^\Q$possdom\E$/,@incdoms)) { + push(@incdoms,$possdom); + } + } + } + } + } + $r->print(&header($pagetitle,$js.$jscript,$loaditems).$crumb. + ''.$pageinfo.'
'. ''.&mt('Your course request has been updated').'
'. - ¬ification_information($disposition,$req_notifylist,$cnum,$now); + if ($crstype eq 'community') { + $output .= ''.&mt('Your community request has been updated').'
'; + } else { + $output .= ''.&mt('Your course request has been updated').'
'; + } + $output .= ¬ification_information($disposition,$req_notifylist,$cnum,$now); } if ($validationerror ne '') { $output .= ''.&mt('An error occurred validating your request with institutional data sources: [_1].',$validationerror).''; @@ -2857,85 +3140,101 @@ sub update_requestors_roles { my $owner = $env{'user.name'}.':'.$env{'user.domain'}; if (ref($details) eq 'HASH') { if (ref($details->{'personnel'}) eq 'HASH') { - if (ref($details->{'personnel'}{$owner}) eq 'HASH') { - my @roles; - if (ref($details->{'personnel'}{$owner}{'roles'}) eq 'ARRAY') { - @roles = sort(@{$details->{'personnel'}{$owner}{'roles'}}); - unless (grep(/^cc$/,@roles)) { - push(@roles,'cc'); - } - } else { - @roles = ('cc'); + my $ccrole = 'cc'; + if ($crstype eq 'community') { + $ccrole = 'co'; + } + unless (ref($details->{'personnel'}{$owner}) eq 'HASH') { + $details->{'personnel'}{$owner} = { + 'roles' => [$ccrole], + $ccrole => { 'usec' => [] }, + }; + } + my @roles; + if (ref($details->{'personnel'}{$owner}{'roles'}) eq 'ARRAY') { + @roles = sort(@{$details->{'personnel'}{$owner}{'roles'}}); + unless (grep(/^\Q$ccrole\E$/,@roles)) { + push(@roles,$ccrole); } - foreach my $role (@roles) { - my $start = $now; - my $end = '0'; - if ($role eq 'st') { - if ($details->{'accessstart'} ne '') { - $start = $details->{'accessstart'}; - } - if ($details->{'accessend'} ne '') { - $end = $details->{'accessend'}; - } - } - my @usecs; - if ($role ne 'cc') { - if (ref($details->{'personnel'}{$owner}{$role}{'usec'}) eq 'ARRAY') { - @usecs = @{$details->{'personnel'}{$owner}{$role}{'usec'}}; - } - } - if ($role eq 'st') { - if (@usecs > 1) { - my $firstsec = $usecs[0]; - @usecs = ($firstsec); - } - } - if (@usecs == 0) { - push(@usecs,''); - } - foreach my $usec (@usecs) { - my (%userroles,%newrole,%newgroups,$spec,$area); - my $area = '/'.$dom.'/'.$cnum; - my $spec = $role.'.'.$area; - if ($usec ne '') { - $spec .= '/'.$usec; - $area .= '/'.$usec; - } + } else { + @roles = ($ccrole); + } + foreach my $role (@roles) { + my $refresh=$env{'user.refresh.time'}; + if ($refresh eq '') { + $refresh = $env{'user.login.time'}; + } + if ($refresh eq '') { + $refresh = $now; + } + my $start = $refresh-1; + my $end = '0'; + if ($role eq 'st') { + if ($details->{'accessstart'} ne '') { + $start = $details->{'accessstart'}; + } + if ($details->{'accessend'} ne '') { + $end = $details->{'accessend'}; + } + } + my @usecs; + if ($role ne $ccrole) { + if (ref($details->{'personnel'}{$owner}{$role}{'usec'}) eq 'ARRAY') { + @usecs = @{$details->{'personnel'}{$owner}{$role}{'usec'}}; + } + } + if ($role eq 'st') { + if (@usecs > 1) { + my $firstsec = $usecs[0]; + @usecs = ($firstsec); + } + } + if (@usecs == 0) { + push(@usecs,''); + } + foreach my $usec (@usecs) { + my (%userroles,%newrole,%newgroups,$spec,$area); + my $area = '/'.$dom.'/'.$cnum; + my $spec = $role.'.'.$area; + if ($usec ne '') { + $spec .= '/'.$usec; + $area .= '/'.$usec; + } + if ($role =~ /^cr\//) { + &Apache::lonnet::custom_roleprivs(\%newrole,$role,$dom, + $cnum,$spec,$area); + } else { + &Apache::lonnet::standard_roleprivs(\%newrole,$role,$dom, + $spec,$cnum,$area); + } + &Apache::lonnet::set_userprivs(\%userroles,\%newrole, + \%newgroups); + $userroles{'user.role.'.$spec} = $start.'.'.$end; + &Apache::lonnet::appenv(\%userroles,[$role,'cm']); + if (($end == 0) || ($end > $now)) { + my $showrole = $role; if ($role =~ /^cr\//) { - &Apache::lonnet::custom_roleprivs(\%newrole,$role,$dom, - $cnum,$spec,$area); - } else { - &Apache::lonnet::standard_roleprivs(\%newrole,$role,$dom, - $spec,$cnum,$area); + $showrole = &Apache::lonnet::plaintext($role,$crstype); + } elsif (ref($longroles) eq 'HASH') { + if ($longroles->{$role} ne '') { + $showrole = $longroles->{$role}; + } } - &Apache::lonnet::set_userprivs(\%userroles,\%newrole, - \%newgroups); - $userroles{'user.role.'.$spec} = $start.'.'.$end; - &Apache::lonnet::appenv(\%userroles,[$role,'cm']); - if (($end == 0) || ($end > $now)) { - my $showrole = $role; - if ($role =~ /^cr\//) { - $showrole = &Apache::lonnet::plaintext($role,$crstype); - } elsif (ref($longroles) eq 'HASH') { - if ($longroles->{$role} ne '') { - $showrole = $longroles->{$role}; - } + if ($start <= $now) { + $active .= '