# The LearningOnline Network
# Pick a course
#
# $Id: lonpickcourse.pm,v 1.117 2016/04/02 04:30:21 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
# This file is part of the LearningOnline Network with CAPA (LON-CAPA).
#
# LON-CAPA is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# LON-CAPA is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with LON-CAPA; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
# /home/httpd/html/adm/gpl.txt
#
# http://www.lon-capa.org/
#
package Apache::lonpickcourse;
use strict;
use Apache::Constants qw(:common);
use Apache::loncommon;
use Apache::lonhtmlcommon;
use Apache::loncoursedata;
use Apache::lonnet;
use Apache::lonlocal;
use Apache::longroup;
use LONCAPA qw(:DEFAULT :match);
sub handler {
my $r = shift;
&Apache::loncommon::content_type($r,'text/html');
$r->send_http_header;
return OK if $r->header_only;
# ------------------------------------------------------------ Print the screen
# Get parameters from query string
&Apache::loncommon::get_unprocessed_cgi
($ENV{'QUERY_STRING'},['domainfilter','form','cnumelement',
'cdomelement','cnameelement','roleelement',
'multiple','type','setroles','fixeddom','cloner',
'crscode','crsdom']);
my ($type,$title,$jscript,$multelement,$multiple,$roleelement,$typeelement,
$lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom,$crscode,$crsdom);
# Get course type - Course, Community or Placement.
$type = $env{'form.type'};
if (!defined($env{'form.type'})) {
$type = 'Course';
}
$title = 'Selecting a '.$type;
# Setup for multiple course selections, if flag for multiples set.
$multiple = $env{'form.multiple'};
if ($multiple) {
($jscript,$multelement) = &multiples_tag();
$title = 'Selecting '.$type.'(s)';
}
# if called when a DC is selecting a course
my $roledom = $env{'form.roleelement'};
if ($roledom) {
$roleelement = '';
$submitopener = &processpick();
$autosubmit = 'process_pick("'.$roledom.'")';
}
if ($env{'form.typeelement'} ne '') {
$typeelement = '';
}
# if called when a DC is creating a course for another user.
if ($env{'form.form'} eq 'ccrs') {
($cloneruname,$clonerudom) = ($env{'form.cloner'} =~ /^($match_username):($match_domain)$/);
$crscode = $env{'form.crscode'};
$crsdom = $env{'request.role.domain'};
}
# if called when requesting a course
if ($env{'form.form'} eq 'requestcrs') {
$cloneruname = $env{'user.name'};
$clonerudom = $env{'user.domain'};
$crscode = $env{'form.crscode'};
$crsdom = $env{'form.crsdom'};
}
my $onlyown = 0;
# if called to assign course-based portfolio access control
if ((($env{'form.form'} eq 'portform') && (!$env{'user.adv'}))) {
$onlyown = 1;
}
my %loaditem;
if (($env{'form.type'} eq 'Course') && ($env{'form.numtitles'})) {
if (($env{'form.official'} eq 'on') && ($env{'form.state'} eq 'listing')) {
$loaditem{'onload'} = 'setElements(document.filterpicker); ';
}
}
if ((($env{'form.form'} eq 'cu') || ($env{'form.form'} eq 'studentform')) &&
($env{'form.pickedcourse'})) {
if ($type ne 'Community') {
my %coursedescription =
&Apache::lonnet::coursedescription($env{'form.pickedcourse'},
{'one_time' => '1'});
my $cdom = $coursedescription{'domain'};
my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
if (($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'})) {
$loaditem{'onload'} .= 'setDefaultCredits();';
}
}
$loaditem{'onload'} .= 'setRoles();setSections();';
}
if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) && (!$onlyown)) {
$loaditem{'onload'} .= 'hideSearching(); ';
}
my $js = &Apache::loncommon::js_changer();
$r->print(&Apache::loncommon::start_page($title,$js,
{'add_entries' => \%loaditem,
'no_nav_bar' => 1, }));
if ($env{'form.form'} eq 'portform') {
$lastaction = 'document.courselist.submit()';
} elsif ($env{'form.form'} eq 'cu' || ($env{'form.form'} eq 'studentform' &&
!$multiple)) {
$lastaction =
'document.courselist.pickedcourse.value = cdom+"_"+cname;'."\n".
'document.courselist.submit();';
} else {
$lastaction = 'self.close()';
}
# if called to assign a role in a course to a user via CUSR
if ($env{'form.form'} eq 'cu' || $env{'form.form'} eq 'studentform') {
$r->print(&create_user_javascript($type));
}
# print javascript functions for choosing a course
if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) ||
$onlyown) {
$r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction));
}
$r->print(&Apache::lonhtmlcommon::scripttag($jscript));
$r->print($submitopener);
# ------------------------------------------ Display of filters to limit search
my $filter = {};
my $action = '/adm/pickcourse';
my ($numtitles,$showroles,$nohost,@codetitles);
unless ($onlyown) {
my $filterlist = ['domainfilter','sincefilter'];
# created filter for DCs only
if ($env{'user.adv'} && $env{'form.domainfilter'} &&
exists($env{'user.role.dc./'.$env{'form.domainfilter'}.'/'})
&& $env{'form.form'} ne 'portform') {
my $loncaparev = &Apache::lonnet::get_server_loncaparev($env{'form.domainfilter'});
if ($loncaparev ne 'unknown_cmd') {
push(@{$filterlist},'createdfilter');
}
}
push(@{$filterlist},('descriptfilter','instcodefilter'));
if ($env{'form.form'} eq 'rules') {
push(@{$filterlist},('personfilter','persondomfilter'));
if ($env{'form.persondomfilter'} eq '') {
unless ($env{'form.gosearch'}) {
$filter->{'persondomfilter'} = $env{'request.role.domain'};
}
} else {
$filter->{'persondomfilter'} =
&LONCAPA::clean_domain($env{'form.persondomfilter'});
}
if (($env{'form.personfilter'} ne '') && ($env{'form.persondomfilter'} ne '')) {
if (&Apache::lonnet::homeserver($env{'form.personfilter'},
$env{'form.persondomfilter'}) eq 'no_host') {
$nohost = 1;
} else {
$showroles = 1;
}
}
} else {
push(@{$filterlist},('ownerfilter','ownerdomfilter'));
}
# course ID filter for DCs only
if ($env{'user.adv'} && $env{'form.domainfilter'} &&
exists($env{'user.role.dc./'.$env{'form.domainfilter'}.'/'})) {
push(@{$filterlist},'coursefilter');
}
if ($cloneruname ne '' && $clonerudom ne '') {
push(@{$filterlist},'cloneableonly');
}
if ((ref($filterlist) eq 'ARRAY') && (ref($filter) eq 'HASH')) {
foreach my $item (@{$filterlist}) {
$filter->{$item} = $env{'form.'.$item};
}
}
if ($env{'form.form'} eq 'portform') {
$filter->{'domainfilter'} ||= $env{'user.domain'};
} elsif ($env{'form.form'} eq 'studentform') {
$filter->{'domainfilter'} ||= $env{'request.role.domain'};
}
my $codedom;
if ($env{'form.fixeddom'}) {
$codedom = $env{'request.role.domain'};
} else {
$codedom = $filter->{'domainfilter'};
}
my ($clonetext,$clonewarning);
if (($env{'form.form'} eq 'ccrs') || ($env{'form.form'} eq 'requestcrs')) {
(my $coord_cloneable,$clonewarning) =
&get_coordinator_cloneable($cloneruname,$clonerudom,$type);
if ($env{'form.form'} eq 'ccrs') {
$clonetext = ''."\n";
}
if ($coord_cloneable) {
$clonetext .= '';
}
if ($crscode ne '') {
$clonetext .= '';
}
if ($crsdom ne '') {
$clonetext .= '';
}
}
$r->print(&Apache::loncommon::build_filters($filterlist,$type,$roleelement,$multelement,
$filter,$action,\$numtitles,undef,$cloneruname,
$clonerudom,$typeelement,\@codetitles,$codedom,
$env{'form.form'},$env{'form.fixeddom'},
$env{'form.prevphase'},$env{'form.cnameelement'},
$env{'form.cnumelement'},$env{'form.cdomelement'},
$env{'form.setroles'},$clonetext,$clonewarning));
}
# ---------------------------------------------------------------- Get the data
if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) ||
$onlyown) {
my $domcloner;
if ($env{'form.form'} eq 'ccrs') {
if (($env{'request.role.domain'} eq $env{'form.domainfilter'}) &&
(&Apache::lonnet::allowed('ccc',$env{'request.role.domain'}))) {
$domcloner = 1;
}
}
my %courses;
if (!$onlyown) {
$r->print('
'.&mt('Searching ...').'
');
$r->rflush();
my $srchdom = $filter->{'domainfilter'};
%courses = &Apache::loncommon::search_courses($srchdom,$type,$filter,$numtitles,
$cloneruname,$clonerudom,$domcloner,
\@codetitles,$env{'form.cc_clone'},
$crsdom,$crscode);
} else {
$r->print(' ');
my %coursehash = &Apache::loncommon::findallcourses();
foreach my $cid (sort(keys(%coursehash))) {
$courses{$cid}{'description'} = $env{'course.'.$cid.'.description'};
}
}
if ($nohost) {
$r->print (''.
&mt('User does not exist - username: [_1], domain: [_2].',
''.$filter->{'personfilter'}.'',
''.$filter->{'persondomfilter'}.'').'');
} else {
&display_matched_courses($r,$type,$multiple,$action,$showroles,$cloneruname,
$clonerudom,$crsdom,$crscode,%courses);
}
}
$r->print(&Apache::loncommon::end_page());
return OK;
}
sub processpick {
my $openerform = 'rolechoice';
if ($env{'form.form'} eq 'studentform') {
$openerform = $env{'form.form'};
}
my $process_pick = <<"ENDONE";
";
return $process_pick;
}
sub create_user_javascript {
my ($type) = @_;
my $output;
#javascript for reporting sections and groups then closing
if ($env{'form.pickedcourse'}) {
my %coursedescription =
&Apache::lonnet::coursedescription($env{'form.pickedcourse'},
{'one_time' => '1'});
my $cdom = $coursedescription{'domain'};
my $cnum = $coursedescription{'num'};
my $crstype = $coursedescription{'type'};
my %domdefs = &Apache::lonnet::get_domain_defaults($cdom);
my ($showcredits,$credits);
if (($crstype ne 'Community') &&
(($domdefs{'officialcredits'} || $domdefs{'unofficialcredits'} || $domdefs{'textbookcredits'}))) {
$showcredits = 1;
$credits = $coursedescription{'internal.defaultcredits'};
}
my $sec_element = 'currsec';
my $grplist_element = 'groups';
my ($sections,$groups) =
&Apache::loncommon::get_secgrprole_info($cdom,$cnum,'',$type);
my $num_sections = scalar(@{$sections});
my $seclist = join(',',@{$sections});
my $num_groups = scalar(@{$groups});
my $groupslist = join(',',@{$groups});
$output = qq|
|;
}
return $output;
}
sub display_matched_courses {
my ($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,$crsdom,$crscode,%courses) = @_;
if ($env{'form.form'} eq 'portform') {
$action = '/adm/portfolio';
}
my $numcourses = keys(%courses);
$r->print('\n");
return;
}
sub multiples_tag {
my $jscript = &Apache::loncommon::check_uncheck_jscript();
my $multelement = '';
return ($jscript,$multelement);
}
sub get_coordinator_cloneable {
my ($cloneruname,$clonerudom,$type) = @_;
if (($cloneruname!~/\w/) || ($clonerudom!~/\w/)) {
my $warning = '