--- loncom/interface/lonrequestcourse.pm 2009/09/13 03:13:55 1.36 +++ loncom/interface/lonrequestcourse.pm 2009/10/24 03:56:01 1.36.2.3 @@ -1,7 +1,7 @@ # The LearningOnline Network # Request a course # -# $Id: lonrequestcourse.pm,v 1.36 2009/09/13 03:13:55 raeburn Exp $ +# $Id: lonrequestcourse.pm,v 1.36.2.3 2009/10/24 03:56:01 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() @@ -238,8 +234,8 @@ sub handler { foreach my $item (@code_order) { $crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item}; } - if ($crosslistcode ne '') { - ($codechk{$i}, my $rest) = + if ($crosslistcode ne '') { + ($codechk{$i}, my $rest) = &Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode); } unless ($codechk{$i} eq 'valid') { @@ -277,7 +273,7 @@ sub handler { my $loaditems = &onload_action($action,$state); my %can_request; - my $canreq = &check_can_request($dom,\%can_request); + my $canreq = &Apache::lonnet::check_can_request($dom,\%can_request); if ($action eq 'new') { if ($canreq) { if ($state eq 'crstype') { @@ -594,52 +590,9 @@ sub onload_action { return \%loaditems; } -sub check_can_request { - my ($dom,$can_request) = @_; - my $canreq = 0; - my ($types,$typename) = &course_types(); - my @options = ('approval','validate','autolimit'); - my $optregex = join('|',@options); - if ((ref($can_request) eq 'HASH') && (ref($types) eq 'ARRAY')) { - foreach my $type (@{$types}) { - if (&Apache::lonnet::usertools_access($env{'user.name'}, - $env{'user.domain'}, - $type,undef,'requestcourses')) { - $canreq ++; - if ($dom eq $env{'user.domain'}) { - $can_request->{$type} = 1; - } - } - if ($env{'environment.reqcrsotherdom.'.$type} ne '') { - my @curr = split(',',$env{'environment.reqcrsotherdom.'.$type}); - if (@curr > 0) { - $canreq ++; - unless ($dom eq $env{'user.domain'}) { - if (grep(/^\Q$dom\E:($optregex)(=?\d*)$/,@curr)) { - $can_request->{$type} = 1; - } - } - } - } - } - } - return $canreq; -} - -sub course_types { - my @types = ('official','unofficial','community'); - my %typename = ( - official => 'Official course', - unofficial => 'Unofficial course', - community => 'Community', - ); - return (\@types,\%typename); -} - - sub print_main_menu { my ($r,$can_request,$states,$dom,$jscript,$loaditems,$crumb) = @_; - my ($types,$typename) = &course_types(); + my ($types,$typename) = &Apache::loncommon::course_types(); my $onchange; unless ($env{'form.interface'} eq 'textual') { $onchange = 1; @@ -658,8 +611,31 @@ sub print_main_menu { } } + my $standby=&mt('Course selected. Please stand by.'); my $js = <<"END"; +function enterrole (thisform,rolecode,buttonname) { + document.title='$standby'; + window.status='$standby'; + thisform.newrole.value=rolecode; + thisform.selectrole.value='1'; + thisform.submit(); +} + +function ToSyllabus(cdom,cnum) { + if (cdom == '' || cdom == null) { + return; + } + if (cnum == '' || cnum == null) { + return; + } + var options = 'height=600,width=800,resizable=yes,scrollbars=yes,location=no,menubar=no,toolbar=no'; + var url = "/public/"+cdom+"/"+cnum+"/syllabus"; + syllwin = window.open(url,'',options,1); + syllwin.focus(); + return; +} + function nextPage(formname) { var crschoice = document.mainmenu_coursetype.crstype.value; var actionchoice = document.mainmenu_action.action.value; @@ -724,18 +700,20 @@ END } END - - $r->print(&header('Course Requests',$js.$jscript,$loaditems).$crumb. - '

'.&mt('Request creation of a new course, or review your pending course requests.').'

'. - '
'. + $r->print(&header('Concept Test Courses',$js.$jscript,$loaditems).$crumb); + my $existing = &existing_courses(); + if ($existing) { + $r->print('
'. + '

'.&mt('Request creation of a new course').'

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

'.&mt('Request creation of a new course, or review your pending course requests.').'

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

'. &Apache::lonhtmlcommon::start_pick_box(). &Apache::lonhtmlcommon::row_title(&mt('Course Domain')). - '

'. - &Apache::loncommon::select_dom_form($dom,'showdom','',1,$onchange)); - if (!$onchange) { - $r->print(' '); - } + ''); + $r->print('GCI Web Center Concept Test Delivery (gcitest)'."\n". + ''); $r->print('
'.&Apache::lonhtmlcommon::row_closure()); my $formname = 'requestcrs'; @@ -745,38 +723,213 @@ END '. &Apache::lonhtmlcommon::row_closure(1). - &Apache::lonhtmlcommon::row_title(&mt('Course Type')).' -
-
'."\n". + &Apache::lonhtmlcommon::row_title(&mt('Course Type')). + &mt($typename->{'unofficial'})."\n". + '
'."\n". + '
'."\n". &Apache::lonhtmlcommon::row_closure(1)."\n". - &Apache::lonhtmlcommon::end_pick_box().'
'."\n". - '
'."\n". + &Apache::lonhtmlcommon::end_pick_box().'

'."\n". + '

'."\n". ''."\n". ''."\n". ''."\n". ''."\n". ''."\n". - '

'); + '

'); + if ($existing) { + $r->print('

'.&mt('Enter an existing Concept Test course').'

'.$existing.'
'); + } else { + $r->print('
'); + } $r->print(&Apache::loncommon::end_page()); return; } +sub existing_courses { + my $output; + my %roleshash = &Apache::lonnet::get_my_roles(undef,undef,'userroles',undef, + ['cc'],['gcitest']); + my %courses; + if (keys(%roleshash) > 0) { + foreach my $key (keys(%roleshash)) { + my ($cnum,$cdom,$role) = split(':',$key); + my ($tstart,$tend) = split(':',$roleshash{$key}); + my %coursehash = &Apache::lonnet::coursedescription($cdom.'/'.$cnum); + $courses{$cdom.'_'.$cnum}{'description'} = $coursehash{'description'}; + $courses{$cdom.'_'.$cnum}{'owner'} = $coursehash{'internal.courseowner'}; + if (defined($coursehash{'default_enrollment_start_date'}) ) { + $courses{$cdom.'_'.$cnum}{'startaccess'} = + &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_start_date'}); + } + if (defined($coursehash{'default_enrollment_end_date'}) ) { + $courses{$cdom.'_'.$cnum}{'endaccess'} = + &Apache::lonlocal::locallocaltime($coursehash{'default_enrollment_end_date'}); + if ($coursehash{'default_enrollment_end_date'} == 0) { + $courses{$cdom.'_'.$cnum}{'endaccess'} = &mt('No ending date'); + } + } + } + $output = '
'. + &Apache::loncommon::start_data_table(). + &Apache::loncommon::start_data_table_header_row(); + my @coltitles = ('Select','Title','Owner(s)', + 'Default Access Dates for Students','Student Counts'); + foreach my $item (@coltitles) { + $output .= ''; + if ($item eq 'Select') { + $output .= '  '; + } else { + $output .= &mt($item); + } + $output .= ''; + } + $output .= &Apache::loncommon::end_data_table_header_row(); + my %courseinfo = &build_courseinfo_hash(\%courses); + my %Sortby; + foreach my $course (sort(keys(%courses))) { + my $clean_title = $courseinfo{$course}{'title'}; + $clean_title =~ s/\W+//g; + if ($clean_title eq '') { + $clean_title = $courseinfo{$course}{'title'}; + } + push(@{$Sortby{$clean_title}},$course); + } + my @sorted_courses; + my @sorted_courses = sort { lc($a) cmp lc($b) } (keys(%Sortby)); + foreach my $item (@sorted_courses) { + foreach my $course (@{$Sortby{$item}}) { + my ($cdom,$cnum) = split('_',$course); + $output.= &Apache::loncommon::start_data_table_row(). + &courseinfo_row($courseinfo{$course},$cnum,$cdom). + &Apache::loncommon::end_data_table_row(); + } + } + $output .= &Apache::loncommon::end_data_table(). + ''. + '
'; + } + return $output; +} + +sub build_courseinfo_hash { + my ($courses) = @_; + my %courseinfo; + foreach my $course (keys(%{$courses})) { + my ($cdom,$cnum) = split('_',$course); + my $descr; + if (ref($courses->{$course}) eq 'HASH') { + $descr = $courses->{$course}{'description'}; + } + my $cleandesc=&HTML::Entities::encode($descr,'<>&"'); + $cleandesc=~s/'/\\'/g; + $cleandesc =~ s/^\s+//; + my ($cdom,$cnum)=split(/\_/,$course); + my ($singleowner,@owners,%ownernames); + if (ref($courses->{$course}) eq 'HASH') { + $singleowner = $courses->{$course}{'owner'}; + push(@owners,$singleowner); + if (ref($courses->{$course}{'co-owners'}) eq 'ARRAY') { + foreach my $item (@{$courses->{$course}{'co-owners'}}) { + push(@owners,$item); + } + } + } + foreach my $owner (@owners) { + my ($ownername,$ownerdom); + if ($owner =~ /:/) { + ($ownername,$ownerdom) = split(/:/,$owner); + } else { + $ownername = $owner; + if ($owner ne '') { + $ownerdom = $cdom; + } + } + if ($ownername ne '' && $ownerdom ne '') { + my %namehash=&Apache::loncommon::getnames($ownername,$ownerdom); + $ownernames{$ownername.':'.$ownerdom} = \%namehash; + } + } + $courseinfo{$course}{'cdom'} = $cdom; + $courseinfo{$course}{'cnum'} = $cnum; + my @lastnames; + foreach my $owner (keys(%ownernames)) { + if (ref($ownernames{$owner}) eq 'HASH') { + push(@lastnames,$ownernames{$owner}{'lastname'}); + } + } + $courseinfo{$course}{'ownerlastnames'} = join(', ',sort(@lastnames)); + $courseinfo{$course}{'title'} = $cleandesc; + $courseinfo{$course}{'owner'} = $singleowner; + my @classids; + $courseinfo{$course}{'counts'} = &count_students($cdom,$cnum,0); + my $startaccess = $courses->{$course}{'startaccess'}; + my $endaccess = $courses->{$course}{'endaccess'}; + my $accessdates; + if ($startaccess) { + $accessdates .= ''.&mt('From:[_1]',' '.$startaccess).'
'; + } + if ($endaccess) { + $accessdates .= ''.&mt('To:[_1]',' '.$endaccess).'
'; + } + $courseinfo{$course}{'access'} = $accessdates; + } + return %courseinfo; +} + +sub courseinfo_row { + my ($info,$cnum,$cdom) = @_; + my $output; + if (ref($info) eq 'HASH') { + my $rolecode = 'cc./'.$cdom.'/'.$cnum; + my $buttonname = $rolecode; + $buttonname=~s/\W//g; + $output .= ''. + ''.$info->{'title'}.' '. + ''. + &mt('Syllabus').''. + ''.$info->{'ownerlastnames'}.''. + ''.$info->{'access'}.''. + ''.$info->{'counts'}.''; + } else { + $output = ''.&mt('No information available for [_1].', + $cdom.'_'.$cnum).''; + return $output; + } + return $output; +} + +sub count_students { + my ($cdom,$cnum,$numsec) = @_; + my $classlist = &Apache::loncoursedata::get_classlist($cdom,$cnum); + my %student_count = ( + Active => 0, + Future => 0, + Expired => 0, + ); + my %idx; + $idx{'status'} = &Apache::loncoursedata::CL_STATUS(); + my %status_title = &Apache::lonlocal::texthash( + Expired => 'Previous access', + Active => 'Current access', + Future => 'Future access', + ); + + while (my ($student,$data) = each(%$classlist)) { + $student_count{$data->[$idx{'status'}]} ++; + } + + my $countslist = &mt('[quant,_1,section:,sections:,No sections]',$numsec).'
'; + foreach my $status ('Active','Future') { + $countslist .= ''.$status_title{$status}.': '. + $student_count{$status}.'
'; + } + return $countslist; +} + + sub request_administration { my ($r,$action,$state,$page,$states,$dom,$jscript,$loaditems,$crumb, $newinstcode,$codechk,$checkedcode,$description,$invalidcrosslist, @@ -1751,7 +1904,7 @@ sub print_request_status { my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'}, $env{'user.name'},'^status:'.$dom); my ($output,$formname,%queue_by_date); - my ($types,$typenames) = &course_types(); + my ($types,$typenames) = &Apache::loncommon::course_types(); foreach my $key (keys(%statusinfo)) { if (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending')) { (undef,my($cdom,$cnum)) = split(':',$key); @@ -1873,7 +2026,7 @@ sub print_cancel_request { } $output = &mt('No further action will be taken'); } elsif (ref($history{'details'}) eq 'HASH') { - my ($types,$typename) = &course_types(); + my ($types,$typename) = &Apache::loncommon::course_types(); my $showtype = $crstype; if (defined($typename->{$crstype})) { $showtype = $typename->{$crstype}; @@ -1959,7 +2112,7 @@ sub print_request_logs { sub print_review { my ($dom,$codetitles,$cat_titles,$cat_order,$code_order,$uname,$udom, $disallowed,$disallowmsg) = @_; - my ($types,$typename) = &course_types(); + my ($types,$typename) = &Apache::loncommon::course_types(); my ($owner,$ownername,$owneremail); if ($uname eq '' || $udom eq '') { $uname = $env{'user.name'}; @@ -2425,7 +2578,7 @@ sub get_course_dom { } } if (($env{'user.domain'} ne '') && ($env{'user.domain'} ne 'public')) { - my ($types,$typename) = &course_types(); + my ($types,$typename) = &Apache::loncommon::course_types(); if (ref($types) eq 'ARRAY') { foreach my $type (@{$types}) { if (&Apache::lonnet::usertools_access($env{'user.name'}, @@ -3090,7 +3243,7 @@ sub check_autolimit { my ($uname,$udom,$dom,$crstype,$limit,$message) = @_; my %crsroles = &Apache::lonnet::get_my_roles($env{'user.name'},$env{'user.domain'}, 'userroles',['active','future'],['cc'],[$dom]); - my ($types,$typename) = &course_types(); + my ($types,$typename) = &Apache::loncommon::course_types(); my %requests = &Apache::lonnet::dumpstore('courserequests',$udom,$uname); my %count; if (ref($types) eq 'ARRAY') {