version 1.697, 2023/03/23 22:54:38
|
version 1.704, 2023/07/20 22:12:39
|
Line 45 use Apache::lontemplate();
|
Line 45 use Apache::lontemplate();
|
use Apache::lonsimplepage(); |
use Apache::lonsimplepage(); |
use Apache::lonhomework(); |
use Apache::lonhomework(); |
use Apache::lonpublisher(); |
use Apache::lonpublisher(); |
use Apache::lonparmset(); |
|
use Apache::loncourserespicker(); |
use Apache::loncourserespicker(); |
use HTML::Entities; |
use HTML::Entities; |
use HTML::TokeParser; |
use HTML::TokeParser; |
Line 719 sub group_import {
|
Line 718 sub group_import {
|
$url = $1; |
$url = $1; |
my $marker = $2; |
my $marker = $2; |
my $info = $3; |
my $info = $3; |
my ($toolid,%toolhash,%toolsettings); |
my ($toolid,$toolprefix,$tooltype,%toolhash,%toolsettings); |
my @extras = ('linktext','explanation','crslabel','crstitle','crsappend'); |
my @extras = ('linktext','explanation','crslabel','crstitle','crsappend'); |
my @toolinfo = split(/:/,$info); |
my @toolinfo = split(/:/,$info); |
if ($residx) { |
if ($residx) { |
Line 728 sub group_import {
|
Line 727 sub group_import {
|
} else { |
} else { |
$toolid = shift(@toolinfo); |
$toolid = shift(@toolinfo); |
} |
} |
|
if ($toolid =~ /^c/) { |
|
$tooltype = 'crs'; |
|
$toolprefix = 'c'; |
|
} else { |
|
$tooltype = 'dom'; |
|
} |
$toolid =~ s/\D//g; |
$toolid =~ s/\D//g; |
($toolhash{'target'},$toolhash{'width'},$toolhash{'height'}, |
($toolhash{'target'},$toolhash{'width'},$toolhash{'height'}, |
$toolhash{'linktext'},$toolhash{'explanation'},$toolhash{'crslabel'}, |
$toolhash{'linktext'},$toolhash{'explanation'},$toolhash{'crslabel'}, |
Line 741 sub group_import {
|
Line 746 sub group_import {
|
$toolhash{'gradable'} =~ s/\D+//g; |
$toolhash{'gradable'} =~ s/\D+//g; |
} |
} |
if (ref($ltitoolsref) eq 'HASH') { |
if (ref($ltitoolsref) eq 'HASH') { |
if (ref($ltitoolsref->{$toolid}) eq 'HASH') { |
if (ref($ltitoolsref->{$tooltype}) eq 'HASH') { |
my @deleted; |
if (ref($ltitoolsref->{$tooltype}->{$toolid}) eq 'HASH') { |
$toolhash{'id'} = $toolid; |
my %tools = %{$ltitoolsref->{$tooltype}->{$toolid}}; |
if (($toolhash{'target'} eq 'iframe') || ($toolhash{'target'} eq 'tab') || |
my @deleted; |
($toolhash{'target'} eq 'window')) { |
$toolhash{'id'} = $toolprefix.$toolid; |
if ($toolhash{'target'} eq 'window') { |
if (($toolhash{'target'} eq 'iframe') || ($toolhash{'target'} eq 'tab') || |
foreach my $item ('width','height') { |
($toolhash{'target'} eq 'window')) { |
$toolhash{$item} =~ s/^\s+//; |
if ($toolhash{'target'} eq 'window') { |
$toolhash{$item} =~ s/\s+$//; |
foreach my $item ('width','height') { |
if ($toolhash{$item} =~ /\D/) { |
$toolhash{$item} =~ s/^\s+//; |
delete($toolhash{$item}); |
$toolhash{$item} =~ s/\s+$//; |
if ($residx) { |
if ($toolhash{$item} =~ /\D/) { |
if ($toolsettings{$item}) { |
delete($toolhash{$item}); |
push(@deleted,$item); |
if ($residx) { |
|
if ($toolsettings{$item}) { |
|
push(@deleted,$item); |
|
} |
} |
} |
} |
} |
} |
} |
} |
} |
} |
} elsif ($residx) { |
} elsif ($residx) { |
$toolhash{'target'} = $toolsettings{'target'}; |
$toolhash{'target'} = $toolsettings{'target'}; |
if ($toolhash{'target'} eq 'window') { |
if ($toolhash{'target'} eq 'window') { |
foreach my $item ('width','height') { |
foreach my $item ('width','height') { |
$toolhash{$item} = $toolsettings{$item}; |
$toolhash{$item} = $toolsettings{$item}; |
} |
|
} |
|
} elsif (ref($tools{'display'}) eq 'HASH') { |
|
$toolhash{'target'} = $tools{'display'}{'target'}; |
|
if ($toolhash{'target'} eq 'window') { |
|
$toolhash{'width'} = $tools{'display'}{'width'}; |
|
$toolhash{'height'} = $tools{'display'}{'height'}; |
} |
} |
} |
} |
} elsif (ref($ltitoolsref->{$toolid}->{'display'}) eq 'HASH') { |
if ($toolhash{'target'} eq 'iframe') { |
$toolhash{'target'} = $ltitoolsref->{$toolid}->{'display'}->{'target'}; |
foreach my $item ('width','height','linktext','explanation') { |
if ($toolhash{'target'} eq 'window') { |
delete($toolhash{$item}); |
$toolhash{'width'} = $ltitoolsref->{$toolid}->{'display'}->{'width'}; |
if ($residx) { |
$toolhash{'height'} = $ltitoolsref->{$toolid}->{'display'}->{'height'}; |
if ($toolsettings{$item}) { |
} |
push(@deleted,$item); |
} |
} |
if ($toolhash{'target'} eq 'iframe') { |
|
foreach my $item ('width','height','linktext','explanation') { |
|
delete($toolhash{$item}); |
|
if ($residx) { |
|
if ($toolsettings{$item}) { |
|
push(@deleted,$item); |
|
} |
} |
} |
} |
} |
} elsif ($toolhash{'target'} eq 'tab') { |
} elsif ($toolhash{'target'} eq 'tab') { |
foreach my $item ('width','height') { |
foreach my $item ('width','height') { |
delete($toolhash{$item}); |
delete($toolhash{$item}); |
if ($residx) { |
if ($residx) { |
if ($toolsettings{$item}) { |
if ($toolsettings{$item}) { |
push(@deleted,$item); |
push(@deleted,$item); |
} |
} |
} |
} |
} |
} |
} |
} |
if (ref($tools{'crsconf'}) eq 'HASH') { |
if (ref($ltitoolsref->{$toolid}->{'crsconf'}) eq 'HASH') { |
foreach my $item ('label','title','linktext','explanation') { |
foreach my $item ('label','title','linktext','explanation') { |
my $crsitem; |
my $crsitem; |
if (($item eq 'label') || ($item eq 'title')) { |
if (($item eq 'label') || ($item eq 'title')) { |
$crsitem = 'crs'.$item; |
$crsitem = 'crs'.$item; |
} else { |
} else { |
$crsitem = $item; |
$crsitem = $item; |
} |
} |
if ($tools{'crsconf'}{$item}) { |
if ($ltitoolsref->{$toolid}->{'crsconf'}->{$item}) { |
$toolhash{$crsitem} =~ s/^\s+//; |
$toolhash{$crsitem} =~ s/^\s+//; |
$toolhash{$crsitem} =~ s/\s+$//; |
$toolhash{$crsitem} =~ s/\s+$//; |
if ($toolhash{$crsitem} eq '') { |
if ($toolhash{$crsitem} eq '') { |
delete($toolhash{$crsitem}); |
|
} |
|
} else { |
delete($toolhash{$crsitem}); |
delete($toolhash{$crsitem}); |
} |
} |
} else { |
if (($residx) && (exists($toolsettings{$crsitem}))) { |
delete($toolhash{$crsitem}); |
unless (exists($toolhash{$crsitem})) { |
} |
push(@deleted,$crsitem); |
if (($residx) && (exists($toolsettings{$crsitem}))) { |
} |
unless (exists($toolhash{$crsitem})) { |
|
push(@deleted,$crsitem); |
|
} |
} |
} |
} |
} |
} |
} |
if ($toolhash{'passback'}) { |
if ($toolhash{'passback'}) { |
my $gradesecret = UUID::Tiny::create_uuid_as_string(UUID_V4); |
my $gradesecret = UUID::Tiny::create_uuid_as_string(UUID_V4); |
$toolhash{'gradesecret'} = $gradesecret; |
$toolhash{'gradesecret'} = $gradesecret; |
$toolhash{'gradesecretdate'} = time; |
$toolhash{'gradesecretdate'} = time; |
} |
} |
if ($toolhash{'roster'}) { |
if ($toolhash{'roster'}) { |
my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4); |
my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4); |
$toolhash{'rostersecret'} = $rostersecret; |
$toolhash{'rostersecret'} = $rostersecret; |
$toolhash{'rostersecretdate'} = time; |
$toolhash{'rostersecretdate'} = time; |
|
} |
|
my $changegradable; |
|
if (($residx) && ($folder =~ /^default/)) { |
|
if ($toolsettings{'gradable'}) { |
|
unless (($toolhash{'gradable'}) || (defined($LONCAPA::map::zombies[$residx]))) { |
|
push(@deleted,'gradable'); |
|
$changegradable = 1; |
|
} |
|
} elsif ($toolhash{'gradable'}) { |
|
$changegradable = 1; |
|
} |
} |
if (($caller eq 'londocs') && (defined($LONCAPA::map::zombies[$residx]))) { |
my $changegradable; |
$changegradable = 1; |
if (($residx) && ($folder =~ /^default/)) { |
if ($toolsettings{'gradable'}) { |
if ($toolsettings{'gradable'}) { |
$toolhash{'gradable'} = 1; |
unless (($toolhash{'gradable'}) || (defined($LONCAPA::map::zombies[$residx]))) { |
|
push(@deleted,'gradable'); |
|
$changegradable = 1; |
|
} |
|
} elsif ($toolhash{'gradable'}) { |
|
$changegradable = 1; |
|
} |
|
if (($caller eq 'londocs') && (defined($LONCAPA::map::zombies[$residx]))) { |
|
$changegradable = 1; |
|
if ($toolsettings{'gradable'}) { |
|
$toolhash{'gradable'} = 1; |
|
} |
} |
} |
} |
} |
} |
my $putres = &Apache::lonnet::put('exttool_'.$marker,\%toolhash,$coursedom,$coursenum); |
my $putres = &Apache::lonnet::put('exttool_'.$marker,\%toolhash,$coursedom,$coursenum); |
if ($putres eq 'ok') { |
if ($putres eq 'ok') { |
if (@deleted) { |
if (@deleted) { |
&Apache::lonnet::del('exttool_'.$marker,\@deleted,$coursedom,$coursenum); |
&Apache::lonnet::del('exttool_'.$marker,\@deleted,$coursedom,$coursenum); |
|
} |
|
if (($changegradable) && ($folder =~ /^default/)) { |
|
my $val; |
|
if ($toolhash{'gradable'}) { |
|
$val = 'yes'; |
|
} else { |
|
$val = 'no'; |
|
} |
} |
&LONCAPA::map::storeparameter($residx,'parameter_0_gradable',$val, |
if (($changegradable) && ($folder =~ /^default/)) { |
'string_yesno'); |
my $val; |
&remember_parms($residx,'gradable','set',$val); |
if ($toolhash{'gradable'}) { |
|
$val = 'yes'; |
|
} else { |
|
$val = 'no'; |
|
} |
|
&LONCAPA::map::storeparameter($residx,'parameter_0_gradable',$val, |
|
'string_yesno'); |
|
&remember_parms($residx,'gradable','set',$val); |
|
} |
|
} else { |
|
return (&mt('Failed to save update to external tool.'),1); |
} |
} |
} else { |
|
return (&mt('Failed to save update to external tool.'),1); |
|
} |
} |
} |
} |
} |
} |
Line 1411 sub print_paste_buffer {
|
Line 1419 sub print_paste_buffer {
|
} |
} |
|
|
my @currpaste = split(/,/,$env{'docs.markedcopies'}); |
my @currpaste = split(/,/,$env{'docs.markedcopies'}); |
my ($pasteitems,@pasteable); |
my ($pasteitems,@pasteable,$same_institution,$checkedsameinst); |
my $clipboardcount = 0; |
my $clipboardcount = 0; |
|
|
# Construct identifiers for current contents of user's paste buffer |
# Construct identifiers for current contents of user's paste buffer |
Line 1424 sub print_paste_buffer {
|
Line 1432 sub print_paste_buffer {
|
($url ne '')) { |
($url ne '')) { |
$clipboardcount ++; |
$clipboardcount ++; |
my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent, |
my ($is_external,$othercourse,$fromsupp,$is_uploaded_map,$parent, |
$canpaste,$nopaste,$othercrs,$areachange,$is_exttool); |
$canpaste,$nopaste,$othercrs,$areachange,$is_exttool,$toolcdom, |
|
$toolcnum,$marker); |
my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1]; |
my $extension = (split(/\./,$env{'docs.markedcopy_url_'.$suffix}))[-1]; |
if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { |
if ($url =~ m{^(?:/adm/wrapper/ext|(?:http|https)(?::|:))//} ) { |
$is_external = 1; |
$is_external = 1; |
} elsif ($url =~ m{^/adm/$match_domain/$match_courseid/\d+/ext\.tool$}) { |
} elsif ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) { |
|
($toolcdom,$toolcnum,$marker) = ($1,$2,$3); |
$is_exttool = 1; |
$is_exttool = 1; |
} |
} |
if ($folder =~ /^supplemental/) { |
if ($folder =~ /^supplemental/) { |
Line 1466 sub print_paste_buffer {
|
Line 1476 sub print_paste_buffer {
|
if ($cid ne $env{'request.course.id'}) { |
if ($cid ne $env{'request.course.id'}) { |
my ($srcdom,$srcnum) = split(/_/,$cid); |
my ($srcdom,$srcnum) = split(/_/,$cid); |
if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { |
if ($env{"user.priv.cm./$srcdom/$srcnum"} =~ /\Q:mdc&F\E/) { |
if (($is_exttool) && ($srcdom ne $coursedom)) { |
if ($is_exttool) { |
$canpaste = 0; |
if ($toolcdom ne $coursedom) { |
$nopaste = &mt('Paste from another domain unavailable.'); |
$canpaste = 0; |
} else { |
$nopaste = &mt('Paste from another domain unavailable.'); |
$othercrs = '<br />'.&mt('(from another course)'); |
} elsif ($toolcnum ne $coursenum) { |
|
my %toolsettings = |
|
&Apache::lonnet::dump('exttool_'.$marker,$toolcdom,$toolcnum); |
|
my %tooltypes = &Apache::loncommon::usable_exttools(); |
|
if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) || |
|
(($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) { |
|
$canpaste = 0; |
|
$nopaste = &mt('Paste from another course unavailable.'); |
|
} elsif ($toolsettings{'id'} =~ /^c\d+$/) { |
|
unless ($checkedsameinst) { |
|
my $primary_id = &Apache::lonnet::domain($coursedom,'primary'); |
|
my $intdom = &Apache::lonnet::internet_dom($primary_id); |
|
if ($intdom ne '') { |
|
my $internet_names = |
|
&Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'}); |
|
if (ref($internet_names) eq 'ARRAY') { |
|
if (grep(/^\Q$intdom\E$/,@{$internet_names})) { |
|
$same_institution = 1; |
|
} |
|
} |
|
} |
|
$checkedsameinst = 1; |
|
} |
|
if ($same_institution) { |
|
$othercrs = '<br />'.&mt('(from another course)'); |
|
} else { |
|
$nopaste = &mt('Paste from another course unavailable.'); |
|
} |
|
} else { |
|
$othercrs = '<br />'.&mt('(from another course)'); |
|
} |
|
} |
} |
} |
} else { |
} else { |
$canpaste = 0; |
$canpaste = 0; |
$nopaste = &mt('Paste from another course unavailable.'); |
$nopaste = &mt('Paste from another course unavailable.'); |
} |
} |
} |
} |
|
} elsif ($url =~ m{/res/($match_domain)/($match_username)/}) { |
|
my ($audom,$auname) = ($1,$2); |
|
unless (($auname eq $coursenum) && ($audom eq $coursedom)) { |
|
if (&Apache::lonnet::is_course($audom,$auname)) { |
|
$canpaste = 0; |
|
$nopaste = &mt('Paste from another course unavailable.'); |
|
} |
|
} |
} |
} |
if ($canpaste) { |
if ($canpaste) { |
push(@pasteable,$suffix); |
push(@pasteable,$suffix); |
Line 1769 sub do_paste_from_buffer {
|
Line 1818 sub do_paste_from_buffer {
|
return(); |
return(); |
} |
} |
|
|
my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%notindom,%duplicate, |
my (%msgs,%before,%after,@dopaste,%is_map,%notinsupp,%notincrs,%notindom, |
%prefixchg,%srcdom,%srcnum,%srcmapidx,%marktomove,$save_err,$lockerrors,$allresult); |
%othcrstool,%othcrsres,%duplicate,%prefixchg,%srcdom,%srcnum,%srcmapidx, |
|
%marktomove,$save_err,$lockerrors,$allresult,%currcrsltitools, |
|
%currltititles,$currltimax,$gotcrsltitools); |
|
$currltimax = 0; |
|
$gotcrsltitools = 0; |
foreach my $suffix (@topaste) { |
foreach my $suffix (@topaste) { |
my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix}); |
my $url=&LONCAPA::map::qtescape($env{'docs.markedcopy_url_'.$suffix}); |
my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix}); |
my $cid=&LONCAPA::map::qtescape($env{'docs.markedcopy_crs_'.$suffix}); |
Line 1810 sub do_paste_from_buffer {
|
Line 1862 sub do_paste_from_buffer {
|
} |
} |
} |
} |
# When buffer was populated using an active role in a different course |
# When buffer was populated using an active role in a different course |
# disallow pasting of External Tool if course is in a different domain. |
# disallow pasting of External Tool if course is in a different domain, |
if (($url =~ m{/ext\.tool$}) && ($srcd ne $coursedom)) { |
# or if External Tool use is not permitted in this course. |
$notindom{$suffix} = 1; |
if ($url =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) { |
next; |
my ($toolcdom,$toolcnum,$marker) = ($1,$2,$3); |
|
if ($toolcdom ne $coursedom) { |
|
$notindom{$suffix} = 1; |
|
next; |
|
} elsif ($toolcnum ne $coursenum) { |
|
my %toolsettings = |
|
&Apache::lonnet::dump('exttool_'.$marker,$toolcdom,$toolcnum); |
|
my %tooltypes = &Apache::loncommon::usable_exttools(); |
|
if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) || |
|
(($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) { |
|
$othcrstool{$suffix} = 1; |
|
next; |
|
} |
|
if ($toolsettings{'id'} =~ /^c\d+$/) { |
|
unless ($gotcrsltitools) { |
|
%currcrsltitools = |
|
&Apache::lonnet::get_course_lti($coursenum,$coursedom,'consumer'); |
|
foreach my $item (sort(keys(%currcrsltitools))) { |
|
if (ref($currcrsltitools{$item}) eq 'HASH') { |
|
$currltimax ++; |
|
if (ref($currltititles{$currcrsltitools{$item}{'title'}}) eq 'ARRAY') { |
|
push(@{$currltititles{$currcrsltitools{$item}{'title'}}},$item); |
|
} else { |
|
$currltititles{$currcrsltitools{$item}{'title'}} = [$item]; |
|
} |
|
} |
|
} |
|
$gotcrsltitools = 1; |
|
} |
|
} |
|
} |
} |
} |
$srcdom{$suffix} = $srcd; |
$srcdom{$suffix} = $srcd; |
$srcnum{$suffix} = $srcn; |
$srcnum{$suffix} = $srcn; |
|
} elsif ($url =~ m{^/res/($match_domain)/($match_courseid)/}) { |
|
my ($audom,$auname) = ($1,$2); |
|
# When buffer was populated using an active role in a different course |
|
# disallow pasting of published resources from Course Authoring Space |
|
unless (($auname eq $coursenum) && ($audom eq $coursedom)) { |
|
if (&Apache::lonnet::is_course($audom,$auname)) { |
|
$othcrsres{$suffix} = 1; |
|
next; |
|
} |
|
} |
} |
} |
$srcmapidx{$suffix} = $mapidx; |
$srcmapidx{$suffix} = $mapidx; |
push(@dopaste,$suffix); |
push(@dopaste,$suffix); |
Line 1868 sub do_paste_from_buffer {
|
Line 1960 sub do_paste_from_buffer {
|
notinsupp => 'Paste failed: content type is not supported within Supplemental Content', |
notinsupp => 'Paste failed: content type is not supported within Supplemental Content', |
notincrs => 'Paste failed: Item is from a different course which you do not have rights to edit.', |
notincrs => 'Paste failed: Item is from a different course which you do not have rights to edit.', |
notindom => 'Paste failed: Item is an external tool from a course in a different domain.', |
notindom => 'Paste failed: Item is an external tool from a course in a different domain.', |
|
othcrstool => 'Paste failed: Item is an external tool from a different course, for which use is not allowed in this course.', |
|
othcrsres => 'Paste failed: Item is a course-authored resource from a different course', |
duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.', |
duplicate => 'Paste failed: only one instance of a particular published sequence or page is allowed within each course.', |
); |
); |
|
|
Line 1896 sub do_paste_from_buffer {
|
Line 1990 sub do_paste_from_buffer {
|
# Retrieve information about all course maps in main content area |
# Retrieve information about all course maps in main content area |
|
|
my $allmaps = {}; |
my $allmaps = {}; |
my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk); |
my (@toclear,%mapurls,%lockerrs,%msgerrs,%results,$donechk, |
|
@updatetoolsenc,$updatetoolscache,$checkedsameinst, |
|
$same_institution); |
|
|
# Loop over the items to paste |
# Loop over the items to paste |
foreach my $suffix (@dopaste) { |
foreach my $suffix (@dopaste) { |
Line 1995 sub do_paste_from_buffer {
|
Line 2091 sub do_paste_from_buffer {
|
$fromothercrs = 1; |
$fromothercrs = 1; |
$info{'cdom'} = $srcdom{$suffix}; |
$info{'cdom'} = $srcdom{$suffix}; |
$info{'cnum'} = $srcnum{$suffix}; |
$info{'cnum'} = $srcnum{$suffix}; |
|
unless ($checkedsameinst) { |
|
my $primary_id = &Apache::lonnet::domain($coursedom,'primary'); |
|
my $intdom = &Apache::lonnet::internet_dom($primary_id); |
|
if ($intdom ne '') { |
|
my $internet_names = |
|
&Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'}); |
|
if (ref($internet_names) eq 'ARRAY') { |
|
if (grep(/^\Q$intdom\E$/,@{$internet_names})) { |
|
$same_institution = 1; |
|
} |
|
} |
|
} |
|
$checkedsameinst = 1; |
|
} |
} |
} |
} |
} |
unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) { |
unless (($env{'form.docs.markedcopy_options_'.$suffix} eq 'move') && (!$fromothercrs)) { |
my (%lockerr,$msg); |
my (%lockerr,$msg); |
my ($newurl,$result,$errtext) = |
my ($newurl,$result,$errtext) = |
&dbcopy(\%info,$coursedom,$coursenum,\%lockerr); |
&dbcopy(\%info,$coursedom,$coursenum,\%lockerr,\%currltititles, |
|
\$currltimax,\@updatetoolsenc,\$updatetoolscache,$same_institution); |
if ($result eq 'ok') { |
if ($result eq 'ok') { |
$url = $newurl; |
$url = $newurl; |
$title=&mt('Copy of').' '.$title; |
$title=&mt('Copy of').' '.$title; |
Line 2169 sub do_paste_from_buffer {
|
Line 2280 sub do_paste_from_buffer {
|
} |
} |
} |
} |
} |
} |
|
if (($updatetoolscache) || (@updatetoolsenc)) { |
|
&update_ltitools_caches($coursedom,$coursenum,$updatetoolscache, |
|
\@updatetoolsenc); |
|
} |
&clear_from_buffer(\@toclear,\@currpaste); |
&clear_from_buffer(\@toclear,\@currpaste); |
my $msgsarray; |
my $msgsarray; |
foreach my $suffix (keys(%msgs)) { |
foreach my $suffix (keys(%msgs)) { |
Line 2217 sub clear_from_buffer {
|
Line 2332 sub clear_from_buffer {
|
return $numdel; |
return $numdel; |
} |
} |
|
|
|
sub update_ltitools_caches { |
|
my ($coursedom,$coursenum,$updatetoolscache,$updatetoolsenc) = @_; |
|
my $hashid=$coursedom.'_'.$coursenum; |
|
if ($updatetoolscache) { |
|
&Apache::lonnet::devalidate_cache_new('courseltitools',$hashid); |
|
} |
|
if ((ref($updatetoolsenc) eq 'ARRAY') && |
|
(@{$updatetoolsenc})) { |
|
my @ids=&Apache::lonnet::current_machine_ids(); |
|
my $updatedone; |
|
foreach my $lonhost (@{$updatetoolsenc}) { |
|
if (grep(/^\Q$lonhost\E$/,@ids)) { |
|
unless ($updatedone) { |
|
&Apache::lonnet::devalidate_cache_new('crsltitoolsenc',$hashid); |
|
} |
|
$updatedone = 1; |
|
} else { |
|
&Apache::lonnet::remote_devalidate_cache($lonhost,["crsltitoolsenc:$hashid"]); |
|
} |
|
} |
|
} |
|
return; |
|
} |
|
|
sub get_newmap_url { |
sub get_newmap_url { |
my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum, |
my ($url,$folder,$prefixchg,$coursedom,$coursenum,$srcdom,$srcnum, |
$titleref,$allmaps,$newurls) = @_; |
$titleref,$allmaps,$newurls) = @_; |
Line 2278 sub get_newmap_url {
|
Line 2417 sub get_newmap_url {
|
} |
} |
|
|
sub dbcopy { |
sub dbcopy { |
my ($dbref,$coursedom,$coursenum,$lockerrorsref) = @_; |
my ($dbref,$coursedom,$coursenum,$lockerrorsref,$currltititles, |
|
$currltimax,$updatetoolsenc,$updatetoolscache,$same_institution) = @_; |
my ($url,$result,$errtext); |
my ($url,$result,$errtext); |
if (ref($dbref) eq 'HASH') { |
if (ref($dbref) eq 'HASH') { |
$url = $dbref->{'src'}; |
$url = $dbref->{'src'}; |
Line 2322 sub dbcopy {
|
Line 2462 sub dbcopy {
|
my %contents=&Apache::lonnet::dump($db_name, |
my %contents=&Apache::lonnet::dump($db_name, |
$dbref->{'cdom'}, |
$dbref->{'cdom'}, |
$dbref->{'cnum'}); |
$dbref->{'cnum'}); |
|
my ($toolcopyerror,$toolpassback,$toolroster,%toolinfo,$oldtoolid,$defincrs); |
|
if ($url eq '/adm/'.$dbref->{'cdom'}.'/'.$dbref->{'cnum'}."/$marker/ext.tool") { |
|
if ($contents{'id'} =~ /^(|c)(\d+)$/) { |
|
$oldtoolid = $2; |
|
if ($1 eq 'c') { |
|
$defincrs = 1; |
|
%toolinfo = |
|
&Apache::lonnet::get('ltitools',[$oldtoolid],$dbref->{'cdom'},$dbref->{'cnum'}); |
|
} else { |
|
%toolinfo= &Apache::lonnet::get_domain_lti($dbref->{'cdom'},'consumer'); |
|
} |
|
if (ref($toolinfo{$oldtoolid}) eq 'HASH') { |
|
if ($toolinfo{$oldtoolid}{'passback'}) { |
|
$toolpassback = 1; |
|
} |
|
if ($toolinfo{$oldtoolid}{'roster'}) { |
|
$toolroster = 1; |
|
} |
|
} else { |
|
$toolcopyerror = 1; |
|
$errtext = &mt('Could not retrieve original settings for pasted external tool.'); |
|
} |
|
} |
|
unless (($dbref->{'cnum'} eq $coursenum) && ($dbref->{'cdom'} eq $coursedom)) { |
|
$url = "/adm/$coursedom/$coursenum/$marker/ext.tool"; |
|
if ($contents{'crstitle'} ne '') { |
|
$contents{'crstitle'} = $env{'course.'.$coursedom.'_'.$coursenum.'.description'}; |
|
} |
|
if (($defincrs) && (!$toolcopyerror)) { |
|
my %newtool; |
|
my $oldcdom = $dbref->{'cdom'}; |
|
my $oldcnum = $dbref->{'cnum'}; |
|
my $title = $toolinfo{$oldtoolid}{'title'}; |
|
if (ref($currltititles) eq 'HASH') { |
|
if (exists($currltititles->{$title})) { |
|
$title .= ' (copied from another course)'; |
|
} |
|
} |
|
my ($newid,$iderror) = |
|
&Apache::lonnet::get_ltitools_id('course',$coursedom,$coursenum,$title); |
|
if ($newid =~ /^\d+$/) { |
|
%{$newtool{$newid}} = %{$toolinfo{$oldtoolid}}; |
|
$newtool{$newid}{'title'} = $title; |
|
if (ref($currltimax)) { |
|
$newtool{$newid}{'order'} = $$currltimax; |
|
} |
|
if ($newtool{$newid}{'image'} =~ m{^\Q/uploaded/$oldcdom/$oldcnum/toollogo/$oldtoolid/\E([^/]+)$}) { |
|
my $fname = $1; |
|
my $content = &Apache::lonnet::getfile($newtool{$newid}{'image'}); |
|
if ($content eq '-1') { |
|
delete($newtool{$newid}{'image'}); |
|
} else { |
|
$env{'form.'.$suffix.'.image'} = $content; |
|
my $newlogo = |
|
&Apache::lonnet::finishuserfileupload($coursenum,$coursedom,$suffix.'.image',"toollogo/$newid/$fname"); |
|
delete($env{'form.'.$suffix.'.image'}); |
|
if ($newlogo =~ m{^/uploaded/}) { |
|
$newtool{$newid}{'image'} = $newlogo; |
|
} else { |
|
delete($newtool{$newid}{'image'}); |
|
} |
|
} |
|
} |
|
my $newusable; |
|
if ($same_institution) { |
|
my %oldtoolsenc = &Apache::lonnet::eget('nohist_toolsenc',[$oldtoolid],$oldcdom,$oldcnum); |
|
if (ref($oldtoolsenc{$oldtoolid}) eq 'HASH') { |
|
my %newtoolsenc; |
|
%{$newtoolsenc{$newid}} = %{$oldtoolsenc{$oldtoolid}}; |
|
my $putres = &Apache::lonnet::put('nohist_toolsenc',\%newtoolsenc,$coursedom,$coursenum,1); |
|
if ($putres eq 'ok') { |
|
if (ref($updatetoolsenc) eq 'ARRAY') { |
|
my $newhome = &Apache::lonnet::homeserver($coursenum,$coursedom); |
|
unless (grep(/^\Q$newhome\E$/,@{$updatetoolsenc})) { |
|
push(@{$updatetoolsenc},$newhome); |
|
} |
|
} |
|
$newusable = 1; |
|
} |
|
} |
|
} |
|
if ($newtool{$newid}{'usable'}) { |
|
unless ($newusable) { |
|
delete($newtool{$newid}{'usable'}); |
|
} |
|
} |
|
my $putres = &Apache::lonnet::put('ltitools',\%newtool,$coursedom,$coursenum); |
|
if ($putres eq 'ok') { |
|
$contents{'id'} = "c$newid"; |
|
if (ref($updatetoolscache)) { |
|
$$updatetoolscache ++; |
|
} |
|
if (ref($currltititles->{$title}) eq 'ARRAY') { |
|
push(@{$currltititles->{$title}},$newid); |
|
} else { |
|
$currltititles->{$title} = [$newid]; |
|
} |
|
if (ref($currltimax)) { |
|
$$currltimax ++; |
|
} |
|
} else { |
|
$toolcopyerror = 1; |
|
$errtext = &mt('Unable to save external tool definition in Course Settings.'); |
|
} |
|
} else { |
|
$toolcopyerror = 1; |
|
$errtext = &mt('Unable to retrieve new tool ID when adding external tool definition to Course Settings.'); |
|
} |
|
} |
|
} |
|
} |
if (exists($contents{'uploaded.photourl'})) { |
if (exists($contents{'uploaded.photourl'})) { |
my $photo = $contents{'uploaded.photourl'}; |
my $photo = $contents{'uploaded.photourl'}; |
my ($subdir,$fname) = |
my ($subdir,$fname) = |
Line 2341 sub dbcopy {
|
Line 2592 sub dbcopy {
|
} |
} |
} |
} |
$db_name =~ s{_\d*$ }{_$suffix}x; |
$db_name =~ s{_\d*$ }{_$suffix}x; |
if (($prefix eq 'exttool') && ($dbref->{'delgradable'}) && ($contents{'gradable'})) { |
if ($prefix eq 'exttool') { |
delete($contents{'gradable'}); |
unless ($toolcopyerror) { |
|
foreach my $key ('oldgradesecret','gradesecret','gradesecretdate','oldrostersecret','rostersecret','rostersecretdate') { |
|
if (exists($contents{$key})) { |
|
delete($contents{$key}); |
|
} |
|
} |
|
if ($dbref->{'delgradable'}) { |
|
if (exists($contents{'gradable'})) { |
|
delete($contents{'gradable'}); |
|
} |
|
} |
|
if ($toolpassback) { |
|
if ($contents{'gradable'}) { |
|
my $gradesecret = UUID::Tiny::create_uuid_as_string(UUID_V4); |
|
$contents{'gradesecret'} = $gradesecret; |
|
$contents{'gradesecretdate'} = time; |
|
} |
|
} |
|
if ($toolroster) { |
|
my $rostersecret = UUID::Tiny::create_uuid_as_string(UUID_V4); |
|
$contents{'rostersecret'} = $rostersecret; |
|
$contents{'rostersecretdate'} = time; |
|
} |
|
} |
} |
} |
$result=&Apache::lonnet::put($db_name,\%contents, |
if (($prefix eq 'exttool') && ($toolcopyerror)) { |
$coursedom,$coursenum); |
$result = 'error'; |
if ($result eq 'ok') { |
} else { |
$url =~ s{/(\d*)/(smppg|bulletinboard|ext\.tool)$}{/$suffix/$2}x; |
$result=&Apache::lonnet::put($db_name,\%contents, |
|
$coursedom,$coursenum); |
|
if ($result eq 'ok') { |
|
$url =~ s{/(\d*)/(smppg|bulletinboard|ext\.tool)$}{/$suffix/$2}x; |
|
} |
} |
} |
} |
} |
if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) { |
if (($freedlock ne 'ok') && (ref($lockerrorsref) eq 'HASH')) { |
Line 2502 sub contained_map_check {
|
Line 2780 sub contained_map_check {
|
if ($token->[1] eq 'resource') { |
if ($token->[1] eq 'resource') { |
next if ($token->[2]->{'type'} eq 'zombie'); |
next if ($token->[2]->{'type'} eq 'zombie'); |
my $ressrc = $token->[2]->{'src'}; |
my $ressrc = $token->[2]->{'src'}; |
if ($ressrc =~ m{^/adm/($match_domain)/$match_courseid/\d+/ext\.tool$}) { |
if ($ressrc =~ m{^/adm/($match_domain)/($match_courseid)/(\d+)/ext\.tool$}) { |
my $srcdom = $1; |
my ($srcdom,$srcnum,$marker) = ($1,$2,$3); |
unless ($srcdom eq $coursedom) { |
unless ($srcdom eq $coursedom) { |
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
next; |
next; |
} |
} |
|
unless ($srcnum eq $coursenum) { |
|
my %toolsettings = |
|
&Apache::lonnet::dump('exttool_'.$marker,$srcdom,$srcnum); |
|
my %tooltypes = &Apache::loncommon::usable_exttools(); |
|
if ((($toolsettings{'id'} =~ /^c\d+$/) && (!$tooltypes{'crs'})) || |
|
(($toolsettings{'id'} =~ /^\d+$/) && (!$tooltypes{'dom'}))) { |
|
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
|
next; |
|
} |
|
} |
} elsif ($folder =~ /^supplemental/) { |
} elsif ($folder =~ /^supplemental/) { |
unless (&supp_pasteable($ressrc)) { |
unless (&supp_pasteable($ressrc)) { |
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
next; |
next; |
} |
} |
} |
} |
|
if ($ressrc =~ m{^/res/($match_domain)/($match_courseid)/}) { |
|
my ($srcdom,$srcnum) = ($1,$2); |
|
unless (($srcnum eq $coursenum) && ($srcdom eq $coursedom)) { |
|
if (&Apache::lonnet::is_course($srcdom,$srcnum)) { |
|
$removefrommap->{$url}{$token->[2]->{'id'}} = $ressrc; |
|
next; |
|
} |
|
} |
|
} |
if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) { |
if ($ressrc =~ m{^/(res|uploaded)/.+\.(sequence|page)$}) { |
if ($1 eq 'uploaded') { |
if ($1 eq 'uploaded') { |
$hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc; |
$hierarchy->{$url}{$token->[2]->{'id'}} = $ressrc; |
Line 2648 sub url_paste_fixups {
|
Line 2945 sub url_paste_fixups {
|
if ($is_exttool) { |
if ($is_exttool) { |
$exttoolchg = 1; |
$exttoolchg = 1; |
} |
} |
} elsif (($rem =~ m{\d+/ext\.tool$}) && |
} elsif (($is_exttool) && |
($env{'form.docs.markedcopy_options'} ne 'move')) { |
($env{'form.docs.markedcopy_options'} ne 'move')) { |
$dbcopies->{$oldurl}{$id}{'src'} = $ressrc; |
$dbcopies->{$oldurl}{$id}{'src'} = $ressrc; |
$dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom; |
$dbcopies->{$oldurl}{$id}{'cdom'} = $srcdom; |
Line 2708 sub apply_fixups {
|
Line 3005 sub apply_fixups {
|
$oldurl,$url,$caller) = @_; |
$oldurl,$url,$caller) = @_; |
my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles, |
my (%rewrites,%zombies,%removefrommap,%removeparam,%dbcopies,%retitles, |
%params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs, |
%params,%newsubdir,%before,%after,%copies,%docmoves,%mapmoves,@msgs, |
%resdatacopy,%lockerrors,$lockmsg); |
%resdatacopy,%lockerrors,$lockmsg,%currcrsltitools,$gotcrsltitools, |
|
%currltititles,$currltimax); |
|
$currltimax = 0; |
if (ref($updated) eq 'HASH') { |
if (ref($updated) eq 'HASH') { |
if (ref($updated->{'rewrites'}) eq 'HASH') { |
if (ref($updated->{'rewrites'}) eq 'HASH') { |
%rewrites = %{$updated->{'rewrites'}}; |
%rewrites = %{$updated->{'rewrites'}}; |
Line 2859 sub apply_fixups {
|
Line 3158 sub apply_fixups {
|
} |
} |
} |
} |
} |
} |
|
my ($updatetoolscache,@updatetoolsenc,$same_institution,$checkedsameinst); |
foreach my $key (keys(%updates)) { |
foreach my $key (keys(%updates)) { |
my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb); |
my (%torewrite,%toretitle,%toremove,%remparam,%currparam,%zombie,%newdb); |
if (ref($rewrites{$key}) eq 'HASH') { |
if (ref($rewrites{$key}) eq 'HASH') { |
Line 2879 sub apply_fixups {
|
Line 3179 sub apply_fixups {
|
if (ref($dbcopies{$key}) eq 'HASH') { |
if (ref($dbcopies{$key}) eq 'HASH') { |
foreach my $idx (keys(%{$dbcopies{$key}})) { |
foreach my $idx (keys(%{$dbcopies{$key}})) { |
if (ref($dbcopies{$key}{$idx}) eq 'HASH') { |
if (ref($dbcopies{$key}{$idx}) eq 'HASH') { |
|
my $oldurl = $dbcopies{$key}{$idx}{'src'}; |
|
my $oldcdom = $dbcopies{$key}{$idx}{'cdom'}; |
|
my $oldcnum = $dbcopies{$key}{$idx}{'cnum'}; |
|
my $oldmarker; |
|
if ($oldurl =~ m{^\Q/adm/$oldcdom/$oldcnum/\E(\d+)/ext\.tool$}) { |
|
$oldmarker = $1; |
|
unless (($gotcrsltitools) || |
|
(($oldcnum eq $cnum) && ($oldcdom eq $cdom))) { |
|
my %oldtoolsettings=&Apache::lonnet::dump('exttool_'.$oldmarker,$oldcdom,$oldcnum); |
|
if ($oldtoolsettings{'id'} =~ /^c\d+$/) { |
|
unless ($gotcrsltitools) { |
|
%currcrsltitools = |
|
&Apache::lonnet::get_course_lti($cnum,$cdom,'consumer'); |
|
foreach my $item (sort(keys(%currcrsltitools))) { |
|
if (ref($currcrsltitools{$item}) eq 'HASH') { |
|
$currltimax ++; |
|
if (ref($currltititles{$currcrsltitools{$item}{'title'}}) eq 'ARRAY') { |
|
push(@{$currltititles{$currcrsltitools{$item}{'title'}}},$item); |
|
} else { |
|
$currltititles{$currcrsltitools{$item}{'title'}} = [$item]; |
|
} |
|
} |
|
} |
|
$gotcrsltitools = 1; |
|
} |
|
unless ($checkedsameinst) { |
|
my $primary_id = &Apache::lonnet::domain($cdom,'primary'); |
|
my $intdom = &Apache::lonnet::internet_dom($primary_id); |
|
if ($intdom ne '') { |
|
my $internet_names = |
|
&Apache::lonnet::get_internet_names($Apache::lonnet::perlvar{'lonHostID'}); |
|
if (ref($internet_names) eq 'ARRAY') { |
|
if (grep(/^\Q$intdom\E$/,@{$internet_names})) { |
|
$same_institution = 1; |
|
} |
|
} |
|
} |
|
$checkedsameinst = 1; |
|
} |
|
} |
|
} |
|
} |
my ($newurl,$result,$errtext) = |
my ($newurl,$result,$errtext) = |
&dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors); |
&dbcopy($dbcopies{$key}{$idx},$cdom,$cnum,\%lockerrors,\%currltititles, |
|
\$currltimax,\@updatetoolsenc,\$updatetoolscache,$same_institution); |
if ($result eq 'ok') { |
if ($result eq 'ok') { |
$newdb{$idx} = $newurl; |
$newdb{$idx} = $newurl; |
|
if ($newurl =~ /ext\.tool$/) { |
|
if ($torewrite{$idx} eq "/adm/$oldcdom/$oldcnum/$oldmarker/ext.tool") { |
|
if ($newurl =~ m{^\Q/adm/$cdom/$cnum/\E(\d+)/ext.tool$}) { |
|
my $newmarker = $1; |
|
unless ($oldmarker eq $newmarker) { |
|
$torewrite{$idx} = "/adm/$oldcdom/$oldcnum/$newmarker/ext.tool"; |
|
} |
|
} |
|
} |
|
} |
} elsif (ref($errors) eq 'HASH') { |
} elsif (ref($errors) eq 'HASH') { |
$errors->{$key} = 1; |
$errors->{$key} = 1; |
} |
} |
Line 3021 sub apply_fixups {
|
Line 3374 sub apply_fixups {
|
} |
} |
} |
} |
} |
} |
|
if (($updatetoolscache) || (@updatetoolsenc)) { |
|
&update_ltitools_caches($cdom,$cnum,$updatetoolscache, |
|
\@updatetoolsenc); |
|
} |
} |
} |
return ('ok',\@msgs,$lockmsg); |
return ('ok',\@msgs,$lockmsg); |
} |
} |
Line 3745 sub multiple_check_form {
|
Line 4102 sub multiple_check_form {
|
return unless (ref($listsref) eq 'HASH'); |
return unless (ref($listsref) eq 'HASH'); |
my $disabled; |
my $disabled; |
unless ($canedit) { |
unless ($canedit) { |
$disabled = 'disabled="disabled"'; |
$disabled = ' disabled="disabled"'; |
} |
} |
my $output = |
my $output = |
'<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'. |
'<form action="/adm/coursedocs" method="post" name="togglemult'.$caller.'">'. |
Line 3783 sub multiple_check_form {
|
Line 4140 sub multiple_check_form {
|
'</label></span></td>'."\n". |
'</label></span></td>'."\n". |
'<td class="LC_docs_entry_parameter">'. |
'<td class="LC_docs_entry_parameter">'. |
'<span class="LC_nobreak LC_docs_copy">'. |
'<span class="LC_nobreak LC_docs_copy">'. |
'<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')"'. $disabled.' />'.&mt('Copy'). |
'<label><input type="checkbox" name="copyall" id="copyall" onclick="propagateState(this.form,'."'copy'".')"'.$disabled.' />'.&mt('Copy'). |
'</label></span></td>'. |
'</label></span></td>'. |
'</tr></table>'."\n"; |
'</tr></table>'."\n"; |
} |
} |
Line 4546 $form_end;
|
Line 4903 $form_end;
|
} else { |
} else { |
$reinit = &mt('(re-initialize course to access)'); |
$reinit = &mt('(re-initialize course to access)'); |
} |
} |
$line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink; |
$line.='<td class="LC_docs_entry_commands"'.$tdalign.'><span class="LC_nobreak">'.$editlink.$renamelink.'</span>'; |
if ($orig_url =~ /$LONCAPA::assess_re/) { |
if ($orig_url =~ /$LONCAPA::assess_re/) { |
$line.= '<br />'; |
$line.= '<br />'; |
if ($curralias ne '') { |
if ($curralias ne '') { |
Line 4557 $form_end;
|
Line 4914 $form_end;
|
$lt{'sa'}.'</a></span>'; |
$lt{'sa'}.'</a></span>'; |
} |
} |
} |
} |
$line.='</td><td>'; |
$line.='</td><td><span class="LC_nobreak">'; |
my ($link,$nolink); |
my ($link,$nolink); |
if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { |
if (($url=~m{/adm/(coursedocs|supplemental)}) || (!$allowed && $url)) { |
if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage) { |
if ($allowed && !$env{'request.role.adv'} && !$isfolder && !$ispage) { |
Line 5725 sub handler {
|
Line 6082 sub handler {
|
my $containertag; |
my $containertag; |
my $pathitem; |
my $pathitem; |
my %ltitools; |
my %ltitools; |
|
my $posslti; |
my $hiddentop; |
my $hiddentop; |
my $navmap; |
my $navmap; |
my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) }; |
my $filterFunc = sub { my $res = shift; return (!$res->randomout() && !$res->is_map()) }; |
Line 5958 sub handler {
|
Line 6316 sub handler {
|
} |
} |
} |
} |
my $tabidstr = join("','",@tabids); |
my $tabidstr = join("','",@tabids); |
%ltitools = &Apache::lonnet::get_domain_lti($coursedom,'consumer'); |
my (%domtools,%crstools); |
my $posslti = keys(%ltitools); |
my %tooltypes = &Apache::loncommon::usable_exttools(); |
|
if ($tooltypes{'dom'}) { |
|
%domtools = &Apache::lonnet::get_domain_lti($coursedom,'consumer'); |
|
} |
|
if ($tooltypes{'crs'}) { |
|
%crstools = &Apache::lonnet::get_course_lti($coursenum,$coursedom,'consumer'); |
|
} |
|
%ltitools = ( |
|
dom => \%domtools, |
|
crs => \%crstools, |
|
); |
|
$posslti = scalar(keys(%domtools)) + scalar(keys(%crstools)); |
my $hostname = $r->hostname(); |
my $hostname = $r->hostname(); |
$script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti, |
$script .= &editing_js($udom,$uname,$supplementalflag,$coursedom,$coursenum,$posslti, |
$londocroot,$canedit,$hostname,\$navmap). |
$londocroot,$canedit,$hostname,\$navmap). |
Line 6163 sub handler {
|
Line 6532 sub handler {
|
'dire' => 'Directory:', |
'dire' => 'Directory:', |
'cate' => 'Category:', |
'cate' => 'Category:', |
'tmpl' => 'Template:', |
'tmpl' => 'Template:', |
|
'empd' => 'No resources found', |
'comment' => 'Comment', |
'comment' => 'Comment', |
'parse' => 'Upload embedded images/multimedia files if HTML file', |
'parse' => 'Upload embedded images/multimedia files if HTML file', |
'bb5' => 'Blackboard 5', |
'bb5' => 'Blackboard 5', |
Line 6212 sub handler {
|
Line 6582 sub handler {
|
my $fileupload=(<<FIUP); |
my $fileupload=(<<FIUP); |
$quotainfo |
$quotainfo |
$lt{'file'}:<br /> |
$lt{'file'}:<br /> |
<input type="file" name="uploaddoc" class="LC_flUpload" size="40" $disabled /> |
|
<input type="hidden" id="LC_free_space" value="$free_space" /> |
|
FIUP |
FIUP |
|
|
my $checkbox=(<<CHBO); |
my $checkbox=(<<CHBO); |
<!-- <label>$lt{'parse'}? |
<!-- <label>$lt{'parse'}? |
<input type="checkbox" name="parserflag" /> |
<input type="checkbox" name="parserflag" /> |
Line 6235 CHBO
|
Line 6602 CHBO
|
<fieldset id="uploadimsform" style="display: none;"> |
<fieldset id="uploadimsform" style="display: none;"> |
<legend>$lt{'imsf'}</legend> |
<legend>$lt{'imsf'}</legend> |
$fileupload |
$fileupload |
|
<input type="file" name="uploaddoc" id="uploaddocims" class="LC_flUpload LC_uploaddoc" size="40" $disabled /> |
|
<input type="hidden" id="LC_free_space_ims" value="$free_space" /> |
<br /> |
<br /> |
<p> |
<p> |
$lt{'cms'}: |
$lt{'cms'}: |
Line 6261 IMSFORM
|
Line 6630 IMSFORM
|
<legend>$lt{'upfi'}</legend> |
<legend>$lt{'upfi'}</legend> |
<input type="hidden" name="active" value="aa" /> |
<input type="hidden" name="active" value="aa" /> |
$fileupload |
$fileupload |
|
<input type="file" name="uploaddoc" class="LC_flUpload" size="40" $disabled /> |
|
<input type="hidden" id="LC_free_space" value="$free_space" /> |
<br /> |
<br /> |
$lt{'title'}:<br /> |
$lt{'title'}:<br /> |
<input type="text" size="60" name="comment" $disabled /> |
<input type="text" size="60" name="comment" $disabled /> |
Line 6311 SEDFFORM
|
Line 6682 SEDFFORM
|
<form action="/adm/coursedocs" method="post" name="crsresimportform" onsubmit="return validImportCrsRes();"> |
<form action="/adm/coursedocs" method="post" name="crsresimportform" onsubmit="return validImportCrsRes();"> |
<fieldset id="importcrsresform" style="display: none;"> |
<fieldset id="importcrsresform" style="display: none;"> |
<legend>$lt{'imcr'}</legend> |
<legend>$lt{'imcr'}</legend> |
|
<div id="importcrsrescontent" style="display: none;"> |
<input type="hidden" name="active" value="bb" /> |
<input type="hidden" name="active" value="bb" /> |
$pickfile |
$pickfile |
<p> |
<p> |
$lt{'title'}: <input type="textbox" name="crsrestitle" value="" $disabled /> |
$lt{'title'}: <input type="text" name="crsrestitle" value="" $disabled /> |
</p> |
</p> |
<input type="hidden" name="importdetail" value="" /> |
<input type="hidden" name="importdetail" value="" /> |
<input type="submit" name="crsres" value="$lt{'impo'}" $disabled /><br /> |
<input type="submit" name="crsres" value="$lt{'impo'}" $disabled /><br /> |
|
</div> |
|
<div id="importcrsresempty" style="display: none;"> |
|
<p> |
|
$lt{'empd'} |
|
</p> |
|
</div> |
</fieldset> |
</fieldset> |
</form> |
</form> |
CRSFORM |
CRSFORM |
Line 6537 NROSTFORM
|
Line 6915 NROSTFORM
|
$help{'Web_Page'} |
$help{'Web_Page'} |
</form> |
</form> |
NWEBFORM |
NWEBFORM |
|
my $showpath = &HTML::Entities::encode($env{'form.folderpath'},'<>&"'); |
my @ids=&Apache::lonnet::current_machine_ids(); |
my @ids=&Apache::lonnet::current_machine_ids(); |
my $machines_str = "'".join("','",@ids)."'"; |
my $machines_str = "'".join("','",@ids)."'"; |
my (%is_home,%toppath,$rolehomes); |
my (%is_home,%toppath,$rolehomes); |
Line 6635 NWEBFORM
|
Line 7013 NWEBFORM
|
"resize_scrollbox('contentscroll','1','0');", |
"resize_scrollbox('contentscroll','1','0');", |
"toggleExampleText();",'template').'<br />'; |
"toggleExampleText();",'template').'<br />'; |
my $templatepreview = '<a href="#" target="sample" onclick="javascript:getExample(600,420,\'yes\',true); return false;">'. |
my $templatepreview = '<a href="#" target="sample" onclick="javascript:getExample(600,420,\'yes\',true); return false;">'. |
'<span id="newresexample">'.&mt('Example').'<span></a>'; |
'<span id="newresexample">'.&mt('Example').'</span></a>'; |
my $crsresform=(<<RESFORM); |
my $crsresform=(<<RESFORM); |
<a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');"> |
<a class="LC_menubuttons_link" href="javascript:toggleCrsRes('res');"> |
$lt{'stpr'}</a>$help{'Course_Resource'} |
$lt{'stpr'}</a>$help{'Course_Resource'} |
Line 6645 NWEBFORM
|
Line 7023 NWEBFORM
|
<input type="hidden" name="active" value="bb" /> |
<input type="hidden" name="active" value="bb" /> |
<p> |
<p> |
$pickdir |
$pickdir |
|
</p> |
<div id="newstdproblem" style="display:none;"> |
<div id="newstdproblem" style="display:none;"> |
|
<p> |
<span class="LC_nobreak">$lt{'news'}? |
<span class="LC_nobreak">$lt{'news'}? |
<label><input type="radio" name="newsubdir" value="0" onclick="toggleNewsubdir(this.form);" checked="checked" $disabled />No</label> |
<label><input type="radio" name="newsubdir" value="0" onclick="toggleNewsubdir(this.form);" checked="checked" $disabled />No</label> |
|
|
Line 6653 NWEBFORM
|
Line 7033 NWEBFORM
|
</span><span id="newsubdir"></span> |
</span><span id="newsubdir"></span> |
<input type="hidden" name="newsubdirname" id="newsubdirname" value="" autocomplete="off" /> |
<input type="hidden" name="newsubdirname" id="newsubdirname" value="" autocomplete="off" /> |
</p> |
</p> |
|
</div> |
$lt{'fnam'} |
$lt{'fnam'} |
<input type="text" size="20" name="newresourcename" autocomplete="off" $disabled /> |
<input type="text" size="20" name="newresourcename" autocomplete="off" $disabled /> |
<p> |
|
<div id="newresource" style="display:none"> |
<div id="newresource" style="display:none"> |
|
<p> |
$lt{'addp'} |
$lt{'addp'} |
<label><input type="radio" name="newresourceadd" value="0" checked="checked" onclick="toggleNewInCourse(this.form);" $disabled /> |
<label><input type="radio" name="newresourceadd" value="0" checked="checked" onclick="toggleNewInCourse(this.form);" $disabled /> |
$lt{'no'}</label> |
$lt{'no'}</label> |
Line 6664 NWEBFORM
|
Line 7045 NWEBFORM
|
$lt{'yes'}</label> |
$lt{'yes'}</label> |
<span id="newrestitle"></span> |
<span id="newrestitle"></span> |
<input type="hidden" size="20" name="newresourcetitle" id="newresourcetitle" autocomplete="off" $disabled /> |
<input type="hidden" size="20" name="newresourcetitle" id="newresourcetitle" autocomplete="off" $disabled /> |
</div> |
|
</p> |
</p> |
|
</div> |
<p> |
<p> |
$lt{'uste'} |
$lt{'uste'} |
<label><input type="radio" name="newresusetemp" value="0" checked="checked" onclick="toggleWithTemplate(this.form);" $disabled /> |
<label><input type="radio" name="newresusetemp" value="0" checked="checked" onclick="toggleWithTemplate(this.form);" $disabled /> |
$lt{'no'}</label> |
$lt{'no'}</label> |
<label><input type="radio" name="newresusetemp" value="1" onclick="toggleWithTemplate(this.form);" $disabled /> |
<label><input type="radio" name="newresusetemp" value="1" onclick="toggleWithTemplate(this.form);" $disabled /> |
$lt{'yes'}</label> |
$lt{'yes'}</label> |
|
</p> |
<div id="newrestemplate" style="display:none"> |
<div id="newrestemplate" style="display:none"> |
$templates |
$templates |
$templatepreview |
$templatepreview |
</div> |
</div> |
</p> |
|
<span class="LC_nobreak"> |
<span class="LC_nobreak"> |
<input type="hidden" name="folderpath" value="$env{'form.folderpath'}" /> |
<input type="hidden" name="folderpath" value="$showpath" /> |
<input type="submit" name="newcrs" value="$lt{'crpr'}" $disabled /> |
<input type="submit" name="newcrs" value="$lt{'crpr'}" $disabled /> |
</span> |
</span> |
</div> |
|
<div id="stdprobswitch" style="display:none;"> |
<div id="stdprobswitch" style="display:none;"> |
$rolehomes |
$rolehomes |
<input type="button" name="switchfornewprob" value="$lt{'swit'}" onclick="switchForProb();" /> |
<input type="button" name="switchfornewprob" value="$lt{'swit'}" onclick="switchForProb();" /> |
Line 6762 NGFFORM
|
Line 7142 NGFFORM
|
my @external = ( |
my @external = ( |
{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleExternal(\'ext\');" />'=>$extresourcesform} |
{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="toggleExternal(\'ext\');" />'=>$extresourcesform} |
); |
); |
if (keys(%ltitools)) { |
if ($posslti) { |
push(@external, |
push(@external, |
{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="toggleExternal(\'tool\');" />'=>$exttoolform}, |
{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="toggleExternal(\'tool\');" />'=>$exttoolform}, |
); |
); |
Line 6801 my %orderhash = (
|
Line 7181 my %orderhash = (
|
'aa' => ['Upload',$fileuploadform], |
'aa' => ['Upload',$fileuploadform], |
'bb' => ['Import',$importpubform], |
'bb' => ['Import',$importpubform], |
'cc' => ['External',$externalform], |
'cc' => ['External',$externalform], |
'dd' => ['Grading',$gradingform], |
'dd' => ['Assessment',$gradingform], |
'ff' => ['Other',$specialdocumentsform], |
'ff' => ['Other',$specialdocumentsform], |
); |
); |
unless ($container eq 'page') { |
unless ($container eq 'page') { |
Line 6854 unless ($container eq 'page') {
|
Line 7234 unless ($container eq 'page') {
|
<legend>$lt{'upfi'}</legend> |
<legend>$lt{'upfi'}</legend> |
<input type="hidden" name="active" value="ee" /> |
<input type="hidden" name="active" value="ee" /> |
$fileupload |
$fileupload |
|
<input type="file" name="uploaddoc" id="uploaddocsupp" class="LC_flUpload LC_uploaddoc" size="40" $disabled /> |
|
<input type="hidden" id="LC_free_space_supp" value="$free_space" /> |
<br /> |
<br /> |
<br /> |
<br /> |
<span class="LC_nobreak"> |
<span class="LC_nobreak"> |
Line 6866 unless ($container eq 'page') {
|
Line 7248 unless ($container eq 'page') {
|
$pathitem |
$pathitem |
<input type="hidden" name="cmd" value="upload_supplemental" /> |
<input type="hidden" name="cmd" value="upload_supplemental" /> |
<input type='submit' value="$lt{'upld'}" /> |
<input type='submit' value="$lt{'upld'}" /> |
|
</fieldset> |
</form> |
</form> |
SUPDOCFORM |
SUPDOCFORM |
|
|
Line 6945 my @specialdocs = (
|
Line 7328 my @specialdocs = (
|
my @supexternal = ( |
my @supexternal = ( |
{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleExternal(\'suppext\')" />' |
{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/extres.png" alt="'.$lt{extr}.'" onclick="javascript:toggleExternal(\'suppext\')" />' |
=>$supextform}); |
=>$supextform}); |
if (keys(%ltitools)) { |
if ($posslti) { |
push(@supexternal, |
push(@supexternal, |
{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="javascript:toggleExternal(\'supptool\')" />' |
{'<img class="LC_noBorder LC_middle" src="/res/adm/pages/exttool.png" alt="'.$lt{extt}.'" onclick="javascript:toggleExternal(\'supptool\')" />' |
=>$supexttoolform}); |
=>$supexttoolform}); |
Line 7963 function toggleImportCrsres(caller) {
|
Line 8346 function toggleImportCrsres(caller) {
|
var curr = document.getElementById('importcrsresform').style.display; |
var curr = document.getElementById('importcrsresform').style.display; |
if (curr == 'none') { |
if (curr == 'none') { |
disp='block'; |
disp='block'; |
populateCrsSelects(document.crsresimportform,'coursepath','coursefile',1,'',1,0,1,1); |
populateCrsSelects(document.crsresimportform,'coursepath','coursefile',1,'',1,0,1,1,0); |
|
if ((document.getElementById('importcrsrescontent')) && |
|
(document.getElementById('importcrsresempty'))) { |
|
var selelem = document.crsresimportform.elements['coursepath']; |
|
var numdirs = 0; |
|
if (selelem.options.length) { |
|
numdirs = selelem.options.length - 1; |
|
} |
|
if (numdirs) { |
|
document.getElementById('importcrsrescontent').style.display='block'; |
|
document.getElementById('importcrsresempty').style.display='none'; |
|
} else { |
|
document.getElementById('importcrsrescontent').style.display='none'; |
|
document.getElementById('importcrsresempty').style.display='block'; |
|
} |
|
} |
} |
} |
} |
} |
document.getElementById('importcrsresform').style.display=disp; |
document.getElementById('importcrsresform').style.display=disp; |
Line 8027 function populateDirSelects(form,locsel,
|
Line 8425 function populateDirSelects(form,locsel,
|
} |
} |
var http = new XMLHttpRequest(); |
var http = new XMLHttpRequest(); |
var url = "/adm/courseauthor"; |
var url = "/adm/courseauthor"; |
var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir; |
var params = "role="+role+"&rec="+recurse+"&nonempty="+nonemptydir+"&addtop=1"; |
http.open("POST", url, true); |
http.open("POST", url, true); |
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); |
http.setRequestHeader("Content-type", "application/x-www-form-urlencoded"); |
http.onreadystatechange = function() { |
http.onreadystatechange = function() { |
Line 9099 END
|
Line 9497 END
|
<sourceavail></sourceavail> |
<sourceavail></sourceavail> |
<standards></standards> |
<standards></standards> |
<subject></subject> |
<subject></subject> |
<title></title> |
<title>Course Authoring Rights</title> |
END |
END |
close($fh); |
close($fh); |
} |
} |