--- loncom/interface/coursecatalog.pm 2013/12/30 01:33:21 1.77
+++ loncom/interface/coursecatalog.pm 2014/04/28 22:12:55 1.84
@@ -1,7 +1,7 @@
# The LearningOnline Network with CAPA
# Handler for displaying the course catalog interface
#
-# $Id: coursecatalog.pm,v 1.77 2013/12/30 01:33:21 raeburn Exp $
+# $Id: coursecatalog.pm,v 1.84 2014/04/28 22:12:55 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -76,26 +76,149 @@ sub handler {
my $domdesc = &Apache::lonnet::domain($codedom,'description');
&Apache::lonhtmlcommon::clear_breadcrumbs();
- if ($env{'form.catalog_maxdepth'} ne '') {
- $env{'form.catalog_maxdepth'} =~ s{\D}{}g;
- }
-
my %domconfig =
&Apache::lonnet::get_dom('configuration',['coursecategories'],$codedom);
- my (@cats,@trails,%allitems,%idx,@jsarray,%subcathash,$cathash);
+ my $knownuser = &user_is_known();
+
+ my ($cathash,$cattype);
if (ref($domconfig{'coursecategories'}) eq 'HASH') {
$cathash = $domconfig{'coursecategories'}{'cats'};
+ if ($knownuser) {
+ $cattype = $domconfig{'coursecategories'}{'auth'};
+ } else {
+ $cattype = $domconfig{'coursecategories'}{'unauth'};
+ }
} else {
$cathash = {};
+ $cattype = 'std';
+ }
+ if ($cattype eq 'none') {
+ $r->print(&Apache::loncommon::start_page('Course/Community Catalog'));
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursecatalog",
+ text=>"Course/Community Catalog"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog'));
+ if ($knownuser) {
+ $r->print('
'.&mt('No catalog of LON-CAPA courses/communities is provided for: [_1]',$domdesc).'
');
+ } else {
+ if ($domconfig{'coursecategories'}{'auth'} eq 'none') {
+ $r->print(''.&mt('No catalog of LON-CAPA courses/communities is provided for: [_1]',$domdesc).'
');
+ } else {
+ $r->print(''.&mt('The catalog of LON-CAPA courses/communities provided for: "[_1]" is only available to users who are logged in.',$domdesc).'
');
+ }
+ }
+ $r->print(&Apache::loncommon::end_page());
+ return OK;
+ }
+
+ my $cnum;
+ if ($cattype eq 'codesrch') {
+ my ($uniquecode,$codemsg,$brtext);
+ if ($env{'form.uniquecode'}) {
+ $uniquecode = $env{'form.uniquecode'};
+ $uniquecode =~ s/^\s+|\s+$//g;
+ }
+ my $js = ''."\n";
+ $r->print(&Apache::loncommon::start_page('Search for a Course/Community',$js));
+ if ($uniquecode =~ /^\w{6}$/) {
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursecatalog",
+ text=>"Course/Community Catalog"});
+ $brtext = 'Search Result';
+ } else {
+ $brtext = 'Course/Community Catalog';
+ }
+ &Apache::lonhtmlcommon::add_breadcrumb
+ ({href=>"/adm/coursecatalog",
+ text=>"$brtext"});
+ $r->print(&Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog'));
+ $r->print(&coursesearch($codedom,$domdesc,$uniquecode));
+ if ($uniquecode =~ /^\w{6}$/) {
+ $r->print(' ');
+ my $confname = $codedom.'-domainconfig';
+ my %codes = &Apache::lonnet::get('uniquecodes',[$uniquecode],$codedom,$confname);
+ if ($codes{$uniquecode}) {
+ $cnum = $codes{$uniquecode};
+ my %courses = &Apache::lonnet::courseiddump($codedom,'.',1,'.','.',
+ $cnum,undef,undef,'.',1);
+ if (keys(%courses)) {
+ $env{'form.coursenum'} = $cnum;
+ my %courseinfo = &build_courseinfo_hash(\%courses,$knownuser,$codedom);
+ undef($env{'form.coursenum'});
+ if (ref($courseinfo{$codedom.'_'.$cnum}) eq 'HASH') {
+ $r->print(&Apache::lonhtmlcommon::start_pick_box());
+ my @cols = ('title','ownerlastnames','seclist','access');
+ my %lt = &Apache::lonlocal::texthash(
+ title => 'Title',
+ ownerlastnames => 'Owner & Co-owner(s)',
+ seclist => 'Sections',
+ access => 'Default Access Dates for Students',
+ );
+ my @shown;
+ foreach my $item (@cols) {
+ if ($courseinfo{$codedom.'_'.$cnum}{$item}) {
+ push(@shown,$item);
+ }
+ }
+ my $num = 0;
+ foreach my $item (@shown) {
+ $num ++;
+ $r->print(&Apache::lonhtmlcommon::row_title($lt{$item}).
+ $courseinfo{$codedom.'_'.$cnum}{$item});
+ if ($item eq 'title') {
+ if ($courseinfo{$codedom.'_'.$cnum}{'showsyllabus'}) {
+ $r->print(' '.
+ ''.
+ &mt('Syllabus').' ');
+ }
+ }
+ my $arg = ( $num == scalar(@shown) ? 1 : '' );
+ $r->print(&Apache::lonhtmlcommon::row_closure($arg));
+ }
+ $r->print(&Apache::lonhtmlcommon::end_pick_box());
+ my $selfenroll = &selfenroll_status($courseinfo{$codedom.'_'.$cnum},$codedom.'_'.$cnum);
+ if ($selfenroll) {
+ $r->print(' '.$selfenroll);
+ }
+ $r->print(''."\n");
+
+ } else {
+ $codemsg = &mt('Code matched, but course ID to which this mapped is invalid.');
+ }
+ } else {
+ $codemsg = &mt('Code matched, but course ID to which this mapped is invalid.');
+ }
+ } else {
+ $codemsg = &mt('No match');
+ }
+ }
+ $r->print(' '.&Apache::loncommon::end_page());
+ return OK;
+ } else {
+ if ($env{'form.coursenum'}) {
+ $cnum = $env{'form.coursenum'};
+ }
+ }
+
+ if ($env{'form.catalog_maxdepth'} ne '') {
+ $env{'form.catalog_maxdepth'} =~ s{\D}{}g;
}
- my $subcats;
+
+ my (@cats,@trails,%allitems,%idx,@jsarray,%subcathash,$subcats);
if ($env{'form.withsubcats'}) {
$subcats = \%subcathash;
}
&Apache::loncommon::extract_categories($cathash,\@cats,\@trails,\%allitems,
\%idx,\@jsarray,$subcats);
my ($numtitles,@codetitles);
- if ($env{'form.coursenum'} ne '' && &user_is_known()) {
+ if (($env{'form.coursenum'} ne '') && ($knownuser)) {
&course_details($r,$codedom,$formname,$domdesc,\@trails,\%allitems,\@codetitles);
} else {
my ($catlinks,$has_subcats,$selitem) = &category_breadcrumbs($codedom,@cats);
@@ -154,7 +277,7 @@ ENDTOGGJS
}
if ($env{'form.currcat_0'} eq 'instcode::0') {
$numtitles = &instcode_course_selector($r,$codedom,$formname,$domdesc,
- $catlinks,$catjs,\@codetitles);
+ $catlinks,$catjs,\@codetitles,$cattype);
if ($env{'form.state'} eq 'listing') {
$r->print(&print_course_listing($codedom,$numtitles,undef,undef,undef,
\@codetitles));
@@ -177,7 +300,7 @@ function check_selected() {
ENDJS
}
$catjs = '';
- &cat_header($r,$codedom,$catjs,\%add_entries,$catlinks);
+ &cat_header($r,$codedom,$catjs,\%add_entries,$catlinks,undef,$cattype);
if ($env{'form.currcat_0'} ne '') {
$r->print('');
+ $r->print(
+ &Apache::lonhtmlcommon::breadcrumbs('Course/Community Catalog').
+ ''.
+ (($env{'form.currcat_0'} eq 'communities::0') ?
+ &mt('Detailed community information:') :
+ &mt('Detailed course information:')).
+ ' '.
+ &print_course_listing($codedom,undef,$trails,$allitems,undef,$codetitles).
+ ' '.
+ '');
return;
}
+sub coursesearch {
+ my ($codedom,$domdesc,$uniquecode) = @_;
+ my %lt = &Apache::lonlocal::texthash (
+ crlk => 'Course look-up',
+ code => 'Code',
+ ifyo => 'Enter the course code (six letters and numbers)',
+ srch => 'Find course',
+ );
+ return <<"END";
+$lt{'crlk'} ($domdesc)
+$lt{'ifyo'}
+
+END
+}
+
sub courselink_javascript {
return <<"END";
@@ -286,7 +428,7 @@ END
}
sub instcode_course_selector {
- my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs,$codetitles) = @_;
+ my ($r,$codedom,$formname,$domdesc,$catlinks,$catjs,$codetitles,$cattype) = @_;
my %coursecodes = ();
my %codes = ();
my %cat_titles = ();
@@ -299,8 +441,11 @@ sub instcode_course_selector {
my ($jscript,$totcodes,$numtitles,$lasttitle) =
&Apache::courseclassifier::instcode_selectors_data($codedom,$formname,
\%cat_items,$codetitles,\%cat_titles,\%cat_order);
- my $js = '';
+ my $js = '';
if ($totcodes) {
if (($env{'form.state'} eq 'listing') && ($numtitles > 0)) {
$add_entries{'onLoad'} = 'setElements();';
@@ -308,7 +453,7 @@ sub instcode_course_selector {
if (&user_is_dc($codedom)) {
$add_entries{'onLoad'} .= ' toggleStatuses();toggleWasActive();'
}
- &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles);
+ &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles,$cattype);
my $cat_maxdepth = $env{'form.catalog_maxdepth'};
$r->print(' ');
} else {
- $js = '';
- &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles);
+ $js = '';
+ &cat_header($r,$codedom,$js,\%add_entries,$catlinks,$numtitles,$cattype);
my $cat_maxdepth = $env{'form.catalog_maxdepth'};
$r->print(''.
- 'print(' '.
' ');
return;
@@ -822,11 +973,13 @@ sub print_course_listing {
$env{'form.coursenum'},
undef,undef,'.',1);
if (keys(%courses) == 0) {
+ $output = '';
if ($env{'form.currcat_0'} eq 'communities::0') {
$output .= &mt('The courseID provided does not match a community in this domain.');
} else {
$output .= &mt('The courseID provided does not match a course in this domain.');
}
+ $output .= '
';
return $output;
}
} else {
@@ -836,17 +989,13 @@ sub print_course_listing {
%courses = &search_courselist($domain,$subcats);
}
if (keys(%courses) == 0) {
+ $output = '';
if ($env{'form.currcat_0'} eq 'communities::0') {
- $output =
- '
'
- .&mt('No communities match the criteria you selected.')
- .'
';
+ $output .= &mt('No communities match the criteria you selected.');
} else {
- $output =
- ''
- .&mt('No courses match the criteria you selected.')
- .'
';
+ $output .= &mt('No courses match the criteria you selected.');
}
+ $output .= '';
return $output;
}
if (($knownuser) && (!$env{'form.showdetails'}) && (!&user_is_dc($domain))) {
@@ -856,10 +1005,8 @@ sub print_course_listing {
}
}
my $now = time;
- my %domconfig =
- &Apache::lonnet::get_dom('configuration',['usercreation'],$domain);
$output .= &construct_data_table($knownuser,$domain,\%courses,$details,undef,
- $now,\%domconfig,$trails,$allitems);
+ $now,$trails,$allitems);
$output .= "\n".''.
' '.
' '.
@@ -868,8 +1015,7 @@ sub print_course_listing {
}
sub construct_data_table {
- my ($knownuser,$domain,$courses,$details,$usersections,$now,$domconfig,
- $trails,$allitems) = @_;
+ my ($knownuser,$domain,$courses,$details,$usersections,$now,$trails,$allitems) = @_;
my %sortname;
if (($details eq '') || ($env{'form.showdetails'})) {
$sortname{'Code'} = 'code';
@@ -1374,29 +1520,39 @@ sub courseinfo_row {
$output .= "".&mt('Show more details').' ';
}
}
- my $selfenroll;
- if ($info->{'selfenroll_types'}) {
- my $showstart = &Apache::lonlocal::locallocaltime($info->{'selfenroll_start'});
- my $showend = &Apache::lonlocal::locallocaltime($info->{'selfenroll_end'});
- if (($info->{'selfenroll_end'} > 0) && ($info->{'selfenroll_end'} > $now)) {
- if (($info->{'selfenroll_start'} > 0) && ($info->{'selfenroll_start'} > $now)) {
- $output .= ''.&mt('Starts: [_1]',''.$showstart.' ').' '.&mt('Ends: [_1]',''.$showend.' ').' ';
- } else {
- $output .= ''.&mt('Enroll in course').' ';
- if ($info->{'selfenroll_end'} == 0) {
- $output .= &mt('Available permanently');
- } elsif ($info->{'selfenroll_end'} > $now) {
- $output .= &mt('Self-enrollment ends: [_1]',''.$showend.' ');
+ my $selfenroll = &selfenroll_status($info,$course);
+ if ($selfenroll) {
+ $output .= ''.$selfenroll.' ';
+ } else {
+ $output .= ' ';
+ }
+ $$countref ++;
+ return $output;
+}
+
+sub selfenroll_status {
+ my ($info,$course) = @_;
+ my $now = time;
+ my $output;
+ if (ref($info) eq 'HASH') {
+ if ($info->{'selfenroll_types'}) {
+ my $showstart = &Apache::lonlocal::locallocaltime($info->{'selfenroll_start'});
+ my $showend = &Apache::lonlocal::locallocaltime($info->{'selfenroll_end'});
+ if (($info->{'selfenroll_end'} > 0) && ($info->{'selfenroll_end'} > $now)) {
+ if (($info->{'selfenroll_start'} > 0) && ($info->{'selfenroll_start'} > $now)) {
+ $output = &mt('Starts: [_1]',''.$showstart.' ').' '.&mt('Ends: [_1]',''.$showend.' ');
+ } else {
+ $output = ''.
+ &mt('Enroll in course').' ';
+ if ($info->{'selfenroll_end'} == 0) {
+ $output .= &mt('Available permanently');
+ } elsif ($info->{'selfenroll_end'} > $now) {
+ $output .= &mt('Self-enrollment ends: [_1]',''.$showend.' ');
+ }
}
- $output .= '';
}
- $selfenroll = 1;
}
}
- if (!$selfenroll) {
- $output .= ' ';
- }
- $$countref ++;
return $output;
}