--- loncom/interface/lonpickcourse.pm 2009/07/29 22:32:44 1.84
+++ loncom/interface/lonpickcourse.pm 2009/10/30 04:44:56 1.87
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Pick a course
#
-# $Id: lonpickcourse.pm,v 1.84 2009/07/29 22:32:44 raeburn Exp $
+# $Id: lonpickcourse.pm,v 1.87 2009/10/30 04:44:56 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -36,7 +36,7 @@ use Apache::lonnet;
use Apache::lonlocal;
use Apache::longroup;
use Apache::courseclassifier;
-use LONCAPA;
+use LONCAPA qw(:DEFAULT :match);
sub handler {
my $r = shift;
@@ -50,9 +50,9 @@ sub handler {
&Apache::loncommon::get_unprocessed_cgi
($ENV{'QUERY_STRING'},['domainfilter','form','cnumelement',
'cdomelement','cnameelement','roleelement',
- 'multiple','type','setroles','fixeddom']);
+ 'multiple','type','setroles','fixeddom','cloner']);
my ($type,$title,$jscript,$multelement,$multiple,$roleelement,
- $lastaction,$autosubmit,$submitopener);
+ $lastaction,$autosubmit,$submitopener,$cloneruname,$clonerudom);
# Get course type - Course or Community.
$type = $env{'form.type'};
@@ -76,6 +76,17 @@ sub handler {
$autosubmit = 'process_pick("'.$roledom.'")';
}
+ # if called when a DC is creating a course
+ if ($env{'form.form'} eq 'ccrs') {
+ ($cloneruname,$clonerudom) = ($env{'form.cloner'} =~ /^($match_username):($match_domain)$/);
+ }
+
+ # if called when requesting a course
+ if ($env{'form.form'} eq 'requestcrs') {
+ $cloneruname = $env{'user.name'};
+ $clonerudom = $env{'user.domain'};
+ }
+
my $onlyown = 0;
# if called to assign course-based portfolio access control
if ((($env{'form.form'} eq 'portform') && (!$env{'user.adv'}))) {
@@ -91,9 +102,13 @@ sub handler {
if ((($env{'form.form'} eq 'cu') || ($env{'form.form'} eq 'studentform')) &&
($env{'form.pickedcourse'})) {
- $loaditem{'onload'} .= 'setSections()';
+ if ($env{'form.form'} eq 'cu') {
+ $loaditem{'onload'} .= 'setRoles();';
+ }
+ $loaditem{'onload'} .= 'setSections();';
}
- $r->print(&Apache::loncommon::start_page($title,undef,
+ my $js = &js_changer();
+ $r->print(&Apache::loncommon::start_page($title,$js,
{'add_entries' => \%loaditem,
'no_nav_bar' => 1, }));
@@ -114,7 +129,8 @@ sub handler {
}
# print javascript functions for choosing a course
- if (($env{'form.command'} eq 'gosearch') || $onlyown) {
+ if ((($env{'form.gosearch'}) && ($env{'form.updater'} eq '')) ||
+ $onlyown) {
$r->print(&gochoose_javascript($type,$multiple,$autosubmit,$lastaction));
}
$r->print('
+
+ENDJS
+
+}
+
sub processpick {
my $openerform = 'rolechoice';
if ($env{'form.form'} eq 'studentform') {
@@ -214,7 +255,12 @@ sub create_user_javascript {
my $output;
#javascript for reporting sections and groups then closing
if ($env{'form.pickedcourse'}) {
- my ($cdom,$cnum) = split/_/,$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 $sec_element = 'currsec';
my $grplist_element = 'groups';
my ($sections,$groups) =
@@ -228,7 +274,10 @@ sub create_user_javascript {
function setSections() {
opener.document.$env{"form.form"}.$grplist_element.value='$groupslist';
window.opener.setSect('$seclist');
- self.close()
+ self.close();
+}
+function setRoles() {
+ window.opener.setRole('$crstype');
}
|;
@@ -238,7 +287,7 @@ function setSections() {
}
sub display_matched_courses {
- my ($r,$type,$multiple,$action,$showroles,%courses) = @_;
+ my ($r,$type,$multiple,$action,$showroles,$cloneruname,$clonerudom,%courses) = @_;
if ($env{'form.form'} eq 'portform') {
$action = '/adm/portfolio';
}
@@ -315,11 +364,26 @@ sub display_matched_courses {
my $cleandesc=&HTML::Entities::encode($description,'<>&"');
$cleandesc=~s/'/\\'/g;
my ($cdom,$cnum)=split(/\_/,$course);
- my ($descr,$instcode,$ttype,@owners);
+ my ($descr,$instcode,$ttype,$canclone,@owners);
if (ref($courses{$course}) eq 'HASH') {
$descr = $courses{$course}{'description'};
- $instcode = $courses{$course}{'inst_code'};
- $ttype = $courses{$course}{'type'};
+ $instcode = $courses{$course}{'inst_code'};
+ $ttype = $courses{$course}{'type'};
+ if (($env{'form.form'} eq 'ccrs') || ($env{'form.form'} eq 'requestcrs')) {
+ my $cloners = $courses{$course}{'cloners'};
+ if ($cloners ne '') {
+ my @cloneable = split(',',$cloners);
+ if (grep(/^\*$/,@cloneable)) {
+ $canclone = 1;
+ }
+ if (grep(/^\*:\Q$env{'form.clonerudom'}\E$/,@cloneable)) {
+ $canclone = 1;
+ }
+ if (grep(/^\Q$cloneruname\E:\Q$clonerudom\E$/,@cloneable)) {
+ $canclone = 1;
+ }
+ }
+ }
push(@owners,&unescape($courses{$course}{'owner'}));
if (ref($courses{$course}{'co-owners'}) eq 'ARRAY') {
foreach my $item (@{$courses{$course}{'co-owners'}}) {
@@ -332,7 +396,7 @@ sub display_matched_courses {
push(@owners,&unescape($singleowner));
}
my $ownerstr = join(', ',@owners);
- $r->print('
'.&course_chooser($multiple,$cdom,$cnum,$cleandesc).' | ');
+ $r->print(''.&course_chooser($multiple,$cdom,$cnum,$cleandesc,$canclone).' | ');
$r->print(''.$description.' | ');
$r->print('');
$r->print(&Apache::lonnet::domain($cdom,'description')?
@@ -397,7 +461,7 @@ sub display_matched_courses {
$r->print('');
$r->print('');
} elsif ($env{'form.form'} eq 'modifycourse') {
- $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','pickedcourse','type','form','numtitles','state','command']));
+ $r->print(&Apache::lonhtmlcommon::echo_form_input(['phase','pickedcourse','type','form','numtitles','state']));
} else {
$r->print(''."\n".
@@ -424,10 +488,9 @@ sub multiples_tag {
sub build_filters {
my ($filterlist,$type,$roleelement,$multelement,$filter,$action,
- $numtitlesref,$caller) = @_;
- my $list;
- my $formname;
- my ($fixeddom,$codedom,$jscript);
+ $numtitlesref,$caller,$cloneruname,$clonerudom) = @_;
+ my ($list,$formname,$fixeddom,$codedom,$jscript);
+ $codedom = $env{'request.role.domain'};
if (defined($env{'form.form'})) {
$formname = $env{'form.form'};
} else {
@@ -435,7 +498,7 @@ sub build_filters {
}
my $onchange;
unless ($env{'form.interface'} eq 'textual') {
- $onchange = 1;
+ $onchange = 'javascript:updateFilters(this)';
}
my ($domainselectform,$sincefilterform,$ownerdomselectform,$persondomselectform,
$instcodeform,$typeselectform,$instcodetitle);
@@ -456,7 +519,7 @@ sub build_filters {
} elsif ($item eq 'personfilter') {
$filter->{$item} = &LONCAPA::clean_username($filter->{$item});
if ($env{'form.persondomfilter'} eq '') {
- unless ($env{'form.command'} eq 'gosearch') {
+ unless ($env{'form.gosearch'}) {
$filter->{'persondomfilter'} = $env{'request.role.domain'};
}
} else {
@@ -529,39 +592,51 @@ sub build_filters {
$typeselectform = '';
- $instcodetitle = $lt{'ins'};
+
+ my ($cloneableonlyform,$cloneabletitle);
+ if (exists($filter->{'cloneableonly'})) {
+ my $cloneableon = '';
+ my $cloneableoff = ' checked="checked"';
+ if ($filter->{'cloneableonly'}) {
+ $cloneableon = $cloneableoff;
+ $cloneableoff = '';
+ }
+ $cloneableonlyform = ''.(' 'x3).'';
+ if ($env{'form.form'} eq 'ccrs') {
+ $cloneabletitle = &mt('Cloneable for').' '.$cloneruname.':'.$clonerudom;
} else {
- $instcodetitle = $lt{'inc'};
+ $cloneabletitle = &mt('Cloneable by you');
}
- if ($env{'form.fixeddom'}) {
- $instcodetitle .= ' ('.$codedom.')';
+ }
+ my $officialjs;
+ if ($type eq 'Course') {
+ if (exists($filter->{'instcodefilter'})) {
+ if (($env{'form.fixeddom'}) || ($formname eq 'requestcrs')
+ || ($formname eq 'modifycourse')) {
+ $officialjs = 1;
+ ($instcodeform,$jscript,$$numtitlesref) =
+ &instcode_selectors($codedom,'filterpicker',$officialjs);
+ if ($jscript) {
+ $jscript = ''."\n";
+ }
+ }
+ if ($instcodeform eq '') {
+ $instcodeform =
+ '';
+ $instcodetitle = $lt{'ins'};
+ } else {
+ $instcodetitle = $lt{'inc'};
+ }
+ if ($env{'form.fixeddom'}) {
+ $instcodetitle .= ' ('.$codedom.')';
+ }
}
}
- $jscript .= <<"END_JS";
-
-function setCommand() {
- document.filterpicker.command.value = 'gosearch';
- return;
-}
-
-END_JS
-
- $jscript = ''."\n";
foreach my $posstype ('Course','Community') {
$typeselectform.=' |