[LON-CAPA-cvs] cvs: loncom /interface londocs.pm
raeburn
raeburn at source.lon-capa.org
Sat Dec 28 07:19:21 EST 2024
raeburn Sat Dec 28 12:19:21 2024 EDT
Modified files:
/loncom/interface londocs.pm
Log:
- Copying files from Course Authoring Space to User's Authoring Space.
- Add radio buttons to indicate whether any selected files which were
published, should be published in new location
- Select default copyright and source availability to apply in metadata
for copied files in new location
- Form validation to check a target Authoring Space was selected.
- onload item added to set drop-down lists to default selections.
-------------- next part --------------
Index: loncom/interface/londocs.pm
diff -u loncom/interface/londocs.pm:1.714 loncom/interface/londocs.pm:1.715
--- loncom/interface/londocs.pm:1.714 Fri Dec 27 02:32:55 2024
+++ loncom/interface/londocs.pm Sat Dec 28 12:19:21 2024
@@ -1,7 +1,7 @@
# The LearningOnline Network
# Documents
#
-# $Id: londocs.pm,v 1.714 2024/12/27 02:32:55 raeburn Exp $
+# $Id: londocs.pm,v 1.715 2024/12/28 12:19:21 raeburn Exp $
#
# Copyright Michigan State University Board of Trustees
#
@@ -579,7 +579,8 @@
$title=~s/[\/\s]+/\_/gs;
$title=&clean($title);
my $formname = 'dumpdoc';
- my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash);
+ my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash).
+ '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
my %uploadedfiles;
&tiehash();
foreach my $file (&Apache::lonclonecourse::crsdirlist($origcrsid,'userfiles')) {
@@ -643,8 +644,8 @@
}
$preamble .= '<div class="LC_left_float">'.
'<fieldset><legend>'.&mt('Folder in Authoring Space').'</legend>'.
- '<input type="text" size="50" name="authorfolder" value="'.$title.'" />'."\n".
- '</fieldset></div><div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
+ '<input type="text" size="30" name="authorfolder" value="'.$title.'" />'."\n".
+ '</fieldset></div>'."\n";
return $preamble;
}
@@ -694,9 +695,70 @@
sub copycrsauthored {
my ($r,$coursenum,$coursedom,$coursehome,$readonly) = @_;
- my ($starthash,$js);
+ my ($starthash,$js,$title,$formname);
+ my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'});
+ $title=$origcrsdata{'description'};
+ $title=~s/[\/\s]+/\_/gs;
+ $title=&clean($title);
+ my ($home,$other,%outhash)=&authorhosts();
unless (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
- $js = <<"ENDJS";
+ my %js_lt;
+ $formname = 'copycrsauthored';
+ if ($home) {
+ %js_lt =
+ &Apache::lonlocal::texthash(
+ yomu => 'You must select an Authoring Space',
+ whco => 'When Copyright set to "custom", URL of a published rights file is needed.',
+ );
+ &js_escape(\%js_lt);
+ }
+ if ($home > 1) {
+ $js = <<"ENDJS";
+<script type="text/javascript">
+// <![CDATA[
+
+function validCrsCopy() {
+ var dest = document.$formname.authorspace.options[document.$formname.authorspace.selectedIndex].value;
+ if (dest == '') {
+ alert("$js_lt{'yomu'}");
+ return false;
+ }
+ var dist = document.$formname.copyright.options[document.$formname.copyright.selectedIndex].value;
+ if (dist == 'custom') {
+ if (document.$formname.customrights.value == '') {
+ alert("$js_lt{'whco'}");
+ return false;
+ }
+ }
+ return true;
+}
+
+function init_copycrs_form() {
+ document.$formname.authorspace.selectedIndex = "0";
+ document.$formname.authorfolder.value = '$title';
+ document.$formname.copyright.selectedIndex = "0";
+}
+
+// ]]>
+</script>
+
+ENDJS
+ } elsif ($home) {
+ $js = <<"ENDJS";
+<script type="text/javascript">
+// <![CDATA[
+
+function init_copycrs_form() {
+ document.$formname.authorfolder.value = '$title';
+ document.$formname.copyright.selectedIndex = "0";
+}
+
+// ]]>
+</script>
+
+ENDJS
+ }
+ $js .= <<"ENDJS";
<script type="text/javascript">
// <![CDATA[
@@ -707,31 +769,45 @@
return;
}
+function showHideCustom(caller,divid) {
+ if (document.getElementById(divid)) {
+ if (caller.options[caller.selectedIndex].value == 'custom') {
+ document.getElementById(divid).style.display="inline-block";
+ } else {
+ document.getElementById(divid).style.display="none";
+ }
+ }
+ return;
+}
+
// ]]>
</script>
ENDJS
+
+ $js .= "\n".&Apache::lonhtmlcommon::scripttag(&Apache::loncommon::browser_and_searcher_javascript())."\n";
$starthash = {
- add_entries => {'onload' => "hide_searching();"},
+ add_entries => {'onload' => "hide_searching(); init_copycrs_form();"},
};
}
$r->print(&Apache::loncommon::start_page('Copy from Course Authoring to User Authoring',$js,$starthash)."\n".
&Apache::lonhtmlcommon::breadcrumbs('Copy from Course Authoring Space')."\n");
$r->print(&startContentScreen('tools'));
- my ($home,$other,%outhash)=&authorhosts();
unless ($home) {
$r->print('<p class="LC_info">'.&mt('No author or co-author roles on this server.').'</p>');
$r->print(&endContentScreen());
return '';
}
+ my $docroot = $r->dir_config('lonDocRoot');
my $is_course_home;
my @ids=&Apache::lonnet::current_machine_ids();
if (($coursehome ne '') && (grep(/^\Q$coursehome\E$/, at ids))) {
$is_course_home = 1;
}
- my %origcrsdata=&Apache::lonnet::coursedescription($env{'request.course.id'});
my $exclude = &Apache::lonnet::priv_exclude();
my $srcurl = "/priv/$coursedom/$coursenum";
- my $srctop = $r->dir_config('lonDocRoot').$srcurl;
+ my $srctop = $docroot.$srcurl;
+ my $resurl = "/res/$coursedom/$coursenum";
+ my $res_exclude = &Apache::lonnet::res_exclude();
if (($env{'form.authorspace'}) && ($env{'form.authorfolder'}=~/\w/)) {
$r->print('<h3>'.&mt('Copying Files and/or Sub-directories').'</h3>');
if ($readonly) {
@@ -748,7 +824,8 @@
}
my ($ca,$cd)=split(/\:/,$env{'form.authorspace'});
my $desturl = "/priv/$cd/$ca";
- my $desttop = $r->dir_config('lonDocRoot').$desturl;
+ my $destresurl = "/res/$cd/$ca";
+ my $desttop = $docroot.$desturl;
my $subdir = &clean($env{'form.authorfolder'});
$subdir = &cleandir($subdir);
if ($subdir eq '') {
@@ -806,8 +883,6 @@
}
if (keys(%tocopy)) {
my (%resdirs,%resfiles);
- my $resurl = "/res/$coursedom/$coursenum";
- my $res_exclude = &Apache::lonnet::res_exclude();
&Apache::lonnet::recursedirs($is_course_home,1,undef,$res_exclude,0,0,$resurl,'',\%resdirs,\%resfiles);
my ($notopdir,%newdir,%newfile,%checkdeps);
$r->print('<p>'.&mt('Copy to: [_1]',
@@ -851,6 +926,39 @@
}
if (-e $desttop.'/'.$subdir) {
my $num = 0;
+ my ($copyright,$customdistfile);
+ if ($env{'form.copyright'} eq 'default' || $env{'form.copyright'} eq 'domain' || $env{'form.copyright'} eq 'public') {
+ $copyright = $env{'form.copyright'};
+ } elsif ($env{'form.copyright'} eq 'custom') {
+ if ($env{'form.customrights'} =~ m{^/res/$match_domain/$match_username/.+\.rights$}) {
+ my ($rightsdom,$rightsuname) = ($1,$2);
+ my $rightshome = &Apache::lonnet::homeserver($rightsdom,$rightsuname);
+ if (($rightshome eq 'no_host') || ($rightshome eq '')) {
+ $copyright = 'default';
+ } elsif (grep(/^\Q$rightshome\E$/, at ids)) {
+ if (-e $docroot.$env{'form.customrights'}) {
+ $copyright = 'custom';
+ $customdistfile = $env{'form.customrights'};
+ } else {
+ $copyright = 'default';
+ }
+ } else {
+ my $rightsfile = &Apache::lonnet::filelocation('',$env{'form.customrights'});
+ unless (&Apache::lonnet::getfile($rightsfile) eq '-1') {
+ $customdistfile = $env{'form.customrights'};
+ }
+ }
+ }
+ }
+ my $sourceavail;
+ if ($env{'form.sourceavail'} =~ /^(open|closed)$/) {
+ $sourceavail = $env{'form.sourceavail'};
+ }
+ my $respublish;
+ if ($env{'form.respublish'}) {
+ $respublish = 1;
+ }
+ my $nokeyref = &Apache::lonpublisher::getnokey($r->dir_config('lonIncludes'));
foreach my $file (keys(%files_to_copy)) {
my ($fail,$dup,$dir_is_file,$src,$dest,$path,$fname);
if ($file =~ m{/}) {
@@ -911,18 +1019,25 @@
}
if ($gotmeta) {
if (open(my $fh,'<',$dest.'.meta')) {
- my ($output,$now);
+ my ($output,$now,setsourceavail);
$now = time;
+ if (($file =~ /\.(xml|html|htm|xhtml|xhtm)$/i) || ($file =~ /$LONCAPA::assess_re/)) {
+ $setsourceavail = 1;
+ }
while (my $line=<$fh>) {
chomp($line);
if ($line eq "<authorspace>$coursenum:$coursedom</authorspace>") {
$output .= "<authorspace>$ca:$cd</authorspace>\n";
} elsif ($line eq '<copyright>custom</copyright>') {
- $output .= "<copyright>default</copyright>\n";
+ $output .= "<copyright>$copyright</copyright>\n";
} elsif ($line =~ m{^<creationdate>\d+</creationdate>$}) {
$output .= "<creationdate>$now</creationdate>\n";
} elsif ($line eq "<customdistributionfile>/res/$coursedom/$coursenum/default.rights</customdistributionfile>") {
- $output .= "<customdistributionfile></customdistributionfile>\n";
+ $output .= "<customdistributionfile>$customdistfile</customdistributionfile>\n";
+ } elsif ($line =~ m{^<sourceavail>(open|closed)</sourceavail>$}) {
+ if ($setsourceavail) {
+ $output .= "<sourceavail>$sourceavail</sourceavail>\n";
+ }
} elsif ($line eq "<domain>$coursedom</domain>") {
$output .= "<domain>$cd</domain>\n";
} elsif ($line =~ m{^<lastrevisiondate>\d+</lastrevisiondate>$}) {
@@ -1095,6 +1210,18 @@
}
}
}
+ if ($respublish) {
+ my $destresfile = $docroot.$destresurl.'/'.$subdir.'/'.$file;
+ if ($path eq '') {
+ if ((ref($resfiles{'/'}) eq 'HASH') &&
+ (exists($resfiles{'/'}{$fname}))) {
+ my $output = &Apache::lonpublisher::batchpublish($r,$dest,$destresfile,$nokeyref,1);
+ }
+ } elsif ((ref($resfiles{$path}) eq 'HASH') &&
+ (exists($resfiles{$path}{$fname}))) {
+ my $output = &Apache::lonpublisher::batchpublish($r,$dest,$destresfile,$nokeyref,1);
+ }
+ }
}
}
}
@@ -1138,7 +1265,6 @@
return '';
}
} else {
- my $formname = 'copycrsauthored';
my $chkname = 'copytouser';
my $context = 'crsauthored';
my (%subdirs,%files, at dirs_by_depth, at files_by_depth,%parent,%children,%hierarchy, at checked_maps);
@@ -1172,9 +1298,19 @@
}
my ($info,$display,$onsubmit,$togglebuttons,$disabled);
my (%resdirs,%resfiles);
- my $resurl = "/res/$coursedom/$coursenum";
- my $resexclude = &Apache::lonnet::res_exclude();
- &Apache::lonnet::recursedirs($is_course_home,1,undef,$resexclude,0,0,$resurl,'',\%resdirs,\%resfiles);
+ &Apache::lonnet::recursedirs($is_course_home,1,undef,$res_exclude,0,0,$resurl,'',\%resdirs,\%resfiles);
+ my $numpub = 0;
+ if (keys(%resfiles)) {
+ foreach my $dir (keys(%resfiles)) {
+ if (ref($resfiles{$dir}) eq 'HASH') {
+ foreach my $file (keys(%{$resfiles{$dir}})) {
+ if (exists($files{$dir}{$file})) {
+ $numpub ++;
+ }
+ }
+ }
+ }
+ }
if ($readonly) {
$disabled = ' disabled="disabled"';
}
@@ -1186,11 +1322,10 @@
' <input type="button" value="'.&mt('uncheck all').'"'.
' onclick="javascript:uncheckAll(document.'.$formname.'.'.$chkname.')" />';
}
- my $title=$origcrsdata{'description'};
- $title=~s/[\/\s]+/\_/gs;
- $title=&clean($title);
- my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash);
- my $display = '<form name="'.$formname.'" action="" method="post">'."\n".
+ my $preamble = &authorspace_selector($r,$formname,$home,$title,%outhash).
+ &courseresource_options($formname,$numpub).
+ '<div style="padding:0;clear:both;margin:0;border:0"></div>'."\n";
+ my $display = '<form name="'.$formname.'" action="" method="post" onsubmit="return validCrsCopy();">'."\n".
$preamble."\n".
'<div class="LC_float_left">'."\n".
'<fieldset>'."\n".
@@ -1326,6 +1461,51 @@
return $count;
}
+sub courseresource_options {
+ my ($formname,$numpub) = @_;
+ my %lt = &Apache::lonlocal::texthash(
+ 'default' => 'System wide - can be used for any courses system wide',
+ 'domain' => 'Domain only - use limited to courses in the domain',
+ 'custom' => 'Customized right of use ...',
+ 'public' => 'Public - no authentication or authorization required for use',
+ 'closed' => 'Closed - XML source is closed to everyone',
+ 'open' => 'Open - XML source is open to people who want to use it',
+ 'sel' => 'Select',
+ );
+ my $output;
+ if ($numpub) {
+ $output .= '<div class="LC_left_float">'.
+ '<fieldset><legend>'.&mt('Published Resources').'</legend>'.
+ &mt('[quant,_1,file] in Course Authoring Space also exist in Resource Space.',
+ $numpub).'</br />'.
+ &mt('Publish copied files in selected Authoring Space?').': '."\n".
+ '<label><input type="radio" name="respublish" checked="checked" value="1" />'.
+ &mt('Yes').'</label>'."\n".
+ '<label><input type="radio" name="respublish" value="0" />'.
+ &mt('No').'</label>'."\n".
+ '</fieldset></div>'."\n";
+ }
+ $output .= '<div class="LC_left_float">'.
+ '<fieldset><legend>'.&mt('Distribution to set in metadata').'</legend>'.
+ &mt('Copyright').': '.
+ '<select name="copyright" onchange="showHideCustom(this,'."'LC_customfile'".');">'."\n".
+ '<option value="default" selected="selected">'.$lt{'default'}.'</option>'."\n".
+ '<option value="domain">'.$lt{'domain'}.'</option>'."\n".
+ '<option value="public">'.$lt{'public'}.'</option>'."\n".
+ '<option value="custom">'.$lt{'custom'}.'</option>'."\n".
+ '</select><div id="LC_customfile" style="padding:0;clear:both;margin:0;border:0;display:none">'."\n".
+ '<input type="text" name="customrights" size="60" value="" />'.
+ '<a href="javascript:openbrowser('."'$formname','customrights','rights'".');">'.
+ $lt{'sel'}.'</a></div><br />'."\n".
+ &mt('Source').' :'.
+ '<select name="sourceavail">'."\n".
+ '<option value="closed" selected="selected">'.$lt{'closed'}.'</option>'."\n".
+ '<option value="open">'.$lt{'open'}.'</option>'."\n".
+ '</select><br />'."\n".
+ '</fieldset></div>'."\n";
+ return $output;
+}
+
sub group_import {
my ($coursenum, $coursedom, $folder, $container, $caller, $ltitoolsref, @files) = @_;
my ($donechk,$allmaps,%hierarchy,%titles,%addedmaps,%removefrommap,
More information about the LON-CAPA-cvs
mailing list