--- loncom/interface/lonpickcourse.pm 2014/05/30 01:50:05 1.115 +++ loncom/interface/lonpickcourse.pm 2016/04/02 04:30:21 1.117 @@ -1,7 +1,7 @@ # The LearningOnline Network # Pick a course # -# $Id: lonpickcourse.pm,v 1.115 2014/05/30 01:50:05 raeburn Exp $ +# $Id: lonpickcourse.pm,v 1.117 2016/04/02 04:30:21 raeburn Exp $ # # Copyright Michigan State University Board of Trustees # @@ -50,11 +50,12 @@ sub handler { &Apache::loncommon::get_unprocessed_cgi ($ENV{'QUERY_STRING'},['domainfilter','form','cnumelement', 'cdomelement','cnameelement','roleelement', - 'multiple','type','setroles','fixeddom','cloner']); + 'multiple','type','setroles','fixeddom','cloner', + 'crscode','crsdom']); my ($type,$title,$jscript,$multelement,$multiple,$roleelement,$typeelement, - $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom); + $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom,$crscode,$crsdom); - # Get course type - Course or Community. + # Get course type - Course, Community or Placement. $type = $env{'form.type'}; if (!defined($env{'form.type'})) { $type = 'Course'; @@ -82,12 +83,16 @@ sub handler { # 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; @@ -220,6 +225,12 @@ sub handler { 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, @@ -247,7 +258,8 @@ sub handler { my $srchdom = $filter->{'domainfilter'}; %courses = &Apache::loncommon::search_courses($srchdom,$type,$filter,$numtitles, $cloneruname,$clonerudom,$domcloner, - \@codetitles,$env{'form.cc_clone'}); + \@codetitles,$env{'form.cc_clone'}, + $crsdom,$crscode); } else { $r->print('
'); my %coursehash = &Apache::loncommon::findallcourses(); @@ -262,7 +274,7 @@ sub handler { ''.$filter->{'persondomfilter'}.'').''); } else { &display_matched_courses($r,$type,$multiple,$action,$showroles,$cloneruname, - $clonerudom,%courses); + $clonerudom,$crsdom,$crscode,%courses); } } $r->print(&Apache::loncommon::end_page()); @@ -371,7 +383,7 @@ function setDefaultCredits() { } sub display_matched_courses { - my ($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,%courses) = @_; + my ($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,$crsdom,$crscode,%courses) = @_; if ($env{'form.form'} eq 'portform') { $action = '/adm/portfolio'; } @@ -445,7 +457,7 @@ sub display_matched_courses { $r->print(''.&mt('Select').'' .''.$titlehdr.'' .''.&mt('Domain').''); - unless ($type eq 'Community') { + unless (($type eq 'Community') || ($type eq 'Placement')) { $r->print(''.&mt('Course Code').''); } $r->print(''.&mt('Owner/Co-owner(s)').''); @@ -464,6 +476,7 @@ sub display_matched_courses { map {$cc_cloneable{$_} = 1;} split('&',$coord_cloneable); } } + my (%gotdomdefaults,%gotcodedefaults); foreach my $description (sort { lc($a) cmp lc($b) } (keys(%by_descrip))) { foreach my $course (@{$by_descrip{$description}}) { $r->print(&Apache::loncommon::start_data_table_row()); @@ -489,7 +502,7 @@ sub display_matched_courses { } unless ($canclone) { my $cloners = $courses{$course}{'cloners'}; - if ($cloners ne '') { + if ($cloners ne '') { my @cloneable = split(',',$cloners); if (grep(/^\*$/,@cloneable)) { $canclone = 1; @@ -500,6 +513,80 @@ sub display_matched_courses { if (grep(/^\Q$cloneruname\E:\Q$clonerudom\E$/,@cloneable)) { $canclone = 1; } + unless ($canclone) { + if (($instcode) && ($crscode) && ($cdom eq $crsdom)) { + foreach my $cloner (@cloneable) { + if (($cloner ne '*') && ($cloner !~ /^\*\:$match_domain$/) && + ($cloner !~ /^$match_username\:$match_domain$/) && ($cloner ne '')) { + if ($cloner =~ /\=/) { + my (%codedefaults,@code_order); + if (ref($gotcodedefaults{$cdom}) eq 'HASH') { + if (ref($gotcodedefaults{$cdom}{'defaults'}) eq 'HASH') { + %codedefaults = %{$gotcodedefaults{$cdom}{'defaults'}}; + } + if (ref($gotcodedefaults{$cdom}{'order'}) eq 'ARRAY') { + @code_order = @{$gotcodedefaults{$cdom}{'order'}}; + } + } else { + &Apache::lonnet::auto_instcode_defaults($cdom, + \%codedefaults, + \@code_order); + $gotcodedefaults{$cdom}{'defaults'} = \%codedefaults; + $gotcodedefaults{$cdom}{'order'} = \@code_order; + } + if (@code_order > 0) { + if (&Apache::lonnet::check_instcode_cloning(\%codedefaults,\@code_order, + $cloner,$instcode,$crscode)) { + $canclone = 1; + last; + } + } + } + } + } + } + } + } else { + my %domdefs; + if (ref($gotdomdefaults{$cdom}) eq 'HASH') { + %domdefs = %{$gotdomdefaults{$cdom}}; + } else { + %domdefs = &Apache::lonnet::get_domain_defaults($cdom); + $gotdomdefaults{$cdom} = \%domdefs; + } + if ($domdefs{'canclone'}) { + unless ($domdefs{'canclone'} eq 'none') { + if ($domdefs{'canclone'} eq 'domain') { + if ($clonerudom eq $cdom) { + $canclone = 1; + } + } elsif (($instcode) && ($crscode) && + ($cdom eq $crsdom)) { + my (%codedefaults,@code_order); + if (ref($gotcodedefaults{$cdom}) eq 'HASH') { + if (ref($gotcodedefaults{$cdom}{'defaults'}) eq 'HASH') { + %codedefaults = %{$gotcodedefaults{$cdom}{'defaults'}}; + } + if (ref($gotcodedefaults{$cdom}{'order'}) eq 'ARRAY') { + @code_order = @{$gotcodedefaults{$cdom}{'order'}}; + } + } else { + &Apache::lonnet::auto_instcode_defaults($cdom, + \%codedefaults, + \@code_order); + $gotcodedefaults{$cdom}{'defaults'} = \%codedefaults; + $gotcodedefaults{$cdom}{'order'} = \@code_order; + } + if (@code_order > 0) { + if (&Apache::lonnet::default_instcode_cloning($cdom,$domdefs{'canclone'}, + $instcode,$crscode,\%codedefaults, + \@code_order)) { + $canclone = 1; + } + } + } + } + } } } } @@ -521,7 +608,7 @@ sub display_matched_courses { $r->print(&Apache::lonnet::domain($cdom,'description')? $cdom.' ('.&Apache::lonnet::domain($cdom,'description').')':$cdom); $r->print(''); - unless ($type eq 'Community') { + unless (($type eq 'Community') || ($type eq 'Placement')) { $r->print(''); if ($instcode ne '') { $r->print(&unescape($instcode)); @@ -619,7 +706,7 @@ sub get_coordinator_cloneable { my ($cc_clone,$ccrole); if ($type eq 'Community') { $ccrole = 'co'; - } elsif ($type eq 'Course') { + } else { $ccrole = 'cc'; } my %ccroles = &Apache::lonnet::get_my_roles($cloneruname,$clonerudom, @@ -664,6 +751,11 @@ sub gochoose_javascript { total => 'coursetotal', list => 'courselist', }, + 'Placement' => { + name => 'coursepick', + total => 'coursetotal', + list => 'courselist', + }, ); my $output = qq| function gochoose(cname,cdom,cdesc) { @@ -785,7 +877,7 @@ Course Activity - how recently was cours Course Domain - the domain of the course =item * -Type - Course or Community +Type - Course, Community or Placement =item * Course Institutional Code - the institutional identifier assigned to the course @@ -838,7 +930,7 @@ Following selection, and/or submission, X B: -Input: 1 - $type - the course type - Course or Community +Input: 1 - $type - the course type - Course, Community, or Placement Output: 1 - $output - javascript wrapped in EscriptEE/scriptE tags @@ -849,9 +941,9 @@ javascript code for reporting selected s =item * X -B: +B: -Input: 7 - request object, course type, multiple (0 or 1), form action, whether to show roles (for course personnel filter), username of new course owner, domain of new course owner, hash of courses. +Input: 8 - request object, course type, multiple (0 or 1), form action, whether to show roles (for course personnel filter), username of new course owner, domain of new course owner, domain of new course, institutional code of new course, hash of courses. Output: 0