--- loncom/interface/lonrequestcourse.pm 2009/09/10 03:00:31 1.34
+++ loncom/interface/lonrequestcourse.pm 2009/10/02 16:15:49 1.36.2.2
@@ -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.36.2.2 2009/10/02 16:15:49 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -178,7 +178,7 @@ sub handler {
$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))) {
@@ -238,8 +238,8 @@ sub handler {
foreach my $item (@code_order) {
$crosslistcode .= $env{'form.crosslist_'.$i.'_'.$item};
}
- if ($crosslistcode ne '') {
- $codechk{$i} =
+ if ($crosslistcode ne '') {
+ ($codechk{$i}, my $rest) =
&Apache::lonnet::auto_validate_instcode('',$dom,$crosslistcode);
}
unless ($codechk{$i} eq 'valid') {
@@ -286,7 +286,8 @@ sub handler {
} 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.
@@ -310,7 +311,7 @@ sub handler {
&close_popup_form());
} else {
&request_administration($r,$action,$state,$page,\%states,$dom,$jscript,
- $loaditems,$crumb,'','','','',$uname,$udom);
+ $loaditems,$crumb,'','','','','',$uname,$udom);
}
} elsif ($action eq 'log') {
&print_request_logs($jscript,$loaditems,$crumb);
@@ -346,7 +347,7 @@ END
sub get_breadcrumbs {
my ($dom,$action,$state,$states,$trail) = @_;
- my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles);
+ my ($crumb,$newinstcode,$codechk,$checkedcode,$numtitles,$description);
my $page = 0;
if ((ref($states) eq 'HASH') && (ref($trail) eq 'HASH') && (ref($state))) {
if (defined($action)) {
@@ -371,7 +372,7 @@ sub get_breadcrumbs {
$$state = 'codepick';
$page --;
} else {
- $codechk =
+ ($codechk,$description) =
&Apache::lonnet::auto_validate_instcode('',
$dom,$newinstcode);
if ($codechk ne 'valid') {
@@ -416,7 +417,7 @@ sub get_breadcrumbs {
{text=>'Pick Action'});
$crumb = &Apache::lonhtmlcommon::breadcrumbs('Course Requests','Course_Requests');
}
- return ($page,$crumb,$newinstcode,$codechk,$checkedcode);
+ return ($page,$crumb,$newinstcode,$codechk,$checkedcode,$description);
}
sub header {
@@ -626,12 +627,12 @@ sub check_can_request {
}
sub course_types {
- my @types = ('official','unofficial','community');
+ my @types = ('unofficial');
my %typename = (
official => 'Official course',
unofficial => 'Unofficial course',
community => 'Community',
- );
+ );
return (\@types,\%typename);
}
@@ -657,8 +658,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;
@@ -723,18 +747,20 @@ END
}
END
-
- $r->print(&header('Course Requests',$js.$jscript,$loaditems).$crumb.
- '
'.&mt('Request creation of a new course, or manage 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::lonhtmlcommon::row_closure());
my $formname = 'requestcrs';
@@ -744,41 +770,217 @@ 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".
&Apache::lonhtmlcommon::row_closure(1)."\n".
- &Apache::lonhtmlcommon::end_pick_box().'
'."\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 = '';
+ }
+ 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,$invalidcrosslist,$uname,$udom) = @_;
+ $newinstcode,$codechk,$checkedcode,$description,$invalidcrosslist,
+ $uname,$udom) = @_;
my $js;
if (($action eq 'new') || (($action eq 'view') && ($state eq 'pick_request'))) {
$js = <print(&header('Request a course',$js.$jscript,$loaditems,$jsextra).$crumb);
&print_request_form($r,$action,$state,$page,$states,$dom,$newinstcode,
- $codechk,$checkedcode,$invalidcrosslist);
+ $codechk,$checkedcode,$description,$invalidcrosslist);
} elsif ($action eq 'view') {
my $jsextra;
my $formname = 'requestcrs';
@@ -1126,7 +1328,7 @@ sub get_instcode {
sub print_request_form {
my ($r,$action,$state,$page,$states,$dom,$newinstcode,$codechk,$checkedcode,
- $invalidcrosslist) = @_;
+ $description,$invalidcrosslist) = @_;
my $formname = 'requestcrs';
my ($next,$prev,$message,$output,$codepicker,$crstype);
$prev = $states->{$action}[$page-1];
@@ -1191,7 +1393,7 @@ sub print_request_form {
if ($instcode eq '') {
$prev = $states->{$action}[$page-2];
}
- $r->print(&courseinfo_form($dom,$formname,$crstype,$next));
+ $r->print(&courseinfo_form($dom,$formname,$crstype,$next,$description));
} elsif ($state eq 'enrollment') {
if ($crstype eq 'official') {
&Apache::lonnet::auto_possible_instcodes($dom,\@codetitles,\%cat_titles,
@@ -1748,14 +1950,8 @@ sub print_request_status {
my ($dom) = @_;
my %statusinfo = &Apache::lonnet::dump('courserequests',$env{'user.domain'},
$env{'user.name'},'^status:'.$dom);
- my ($output,$formname,%queue_by_date,%typenames);
- if ($env{'form.crstype'} eq 'any') {
- %typenames = &Apache::lonlocal::texthash (
- official => 'Official course',
- unofficial => 'Unofficial course',
- community => 'Community',
- );
- }
+ my ($output,$formname,%queue_by_date);
+ my ($types,$typenames) = &course_types();
foreach my $key (keys(%statusinfo)) {
if (($statusinfo{$key} eq 'approval') || ($statusinfo{$key} eq 'pending')) {
(undef,my($cdom,$cnum)) = split(':',$key);
@@ -1826,7 +2022,10 @@ sub print_request_status {
''.&unescape($desc).' | '.
''.$cdom.' | ';
if ($env{'form.crstype'} eq 'any') {
- my $typename = $typenames{$type};
+ my $typename;
+ if (ref($typenames) eq 'HASH') {
+ $typename = &mt($typenames->{$type});
+ }
if ($typename eq '') {
$typename = &mt('Unknown type');
}
@@ -1979,7 +2178,7 @@ sub print_review {
$crstypename = $env{'form.crstype'};
if (ref($typename) eq 'HASH') {
unless ($typename->{$env{'form.crstype'}} eq '') {
- $crstypename = $typename->{$env{'form.crstype'}};
+ $crstypename = &mt($typename->{$env{'form.crstype'}});
}
}
my $category = 'Course';
@@ -2241,7 +2440,7 @@ sub dates_from_form {
}
sub courseinfo_form {
- my ($dom,$formname,$crstype,$next) = @_;
+ my ($dom,$formname,$crstype,$next,$description) = @_;
my %lt = &Apache::lonlocal::texthash(
official => 'You must provide a (brief) course description.',
community => 'You must provide a (brief) community description.'
@@ -2271,7 +2470,7 @@ ENDJS
''.&Apache::loncommon::help_open_topic('Course_Request_Description').' '.$title.'
'.
&Apache::lonhtmlcommon::row_closure(1).
&Apache::lonhtmlcommon::row_title(&mt('Description')).
- '';
+ '';
my ($home_server_pick,$numlib) =
&Apache::loncommon::home_server_form_item($dom,'chome',
'default','hide');
@@ -2295,14 +2494,14 @@ sub clone_form {
if ($crstype eq 'community') {
$type = 'Community';
}
- my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').
+ my $cloneform = &Apache::loncommon::select_dom_form($dom,'clonedom').' '.
&Apache::loncommon::selectcourse_link($formname,'clonecrs','clonedom','','','',$type);
my %lt = &clone_text();
my $output .=
&Apache::lonhtmlcommon::row_title($lt{'cid'}).''.&Apache::lonhtmlcommon::row_closure(1).''.
+ ''.&Apache::lonhtmlcommon::row_closure(1).
+ &Apache::lonhtmlcommon::row_title($lt{'dmn'}).''.&Apache::lonhtmlcommon::row_closure(1).
&Apache::lonhtmlcommon::row_title($lt{'dsh'}).'