[LON-CAPA-cvs] cvs: loncom /interface multidownload.pl

raeburn raeburn at source.lon-capa.org
Wed Sep 2 10:52:08 EDT 2020


raeburn		Wed Sep  2 14:52:08 2020 EDT

  Modified files:              
    /loncom/interface	multidownload.pl 
  Log:
  - If problem has file upload items (in essayresponse) in multiple parts
    can select which parts to include when downloading submitted files
  
  
-------------- next part --------------
Index: loncom/interface/multidownload.pl
diff -u loncom/interface/multidownload.pl:1.42 loncom/interface/multidownload.pl:1.43
--- loncom/interface/multidownload.pl:1.42	Wed May  2 16:59:44 2018
+++ loncom/interface/multidownload.pl	Wed Sep  2 14:52:08 2020
@@ -2,7 +2,7 @@
 # CGI-script to allow download of all essay submissions of 
 # multiple students.
 #
-# $Id: multidownload.pl,v 1.42 2018/05/02 16:59:44 raeburn Exp $
+# $Id: multidownload.pl,v 1.43 2020/09/02 14:52:08 raeburn Exp $
 # Copyright Michigan State University Board of Trustees
 #
 # This file is part of the LearningOnline Network with CAPA (LON-CAPA).
@@ -130,114 +130,134 @@
     my $number_of_students = scalar(@stuchecked);
     my %prog_state=&Apache::lonhtmlcommon::Create_PrgWin('',$number_of_students);
     my @parts = split(/\n/,$env{'cgi.'.$identifier.'.parts'});
-    my $doc_zip_root = $Apache::lonnet::perlvar{'lonZipDir'};
-    my $manifest;
-    unless (-d "$doc_zip_root/zipdir/$unique_user/$unique_path") {
-        &File::Path::mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path",0,0700);
-    }
-    if (open(MANIFEST,'>',"$doc_zip_root/zipdir/$unique_user/$unique_path/manifest.txt")) {
-        $manifest = 1;
-        print MANIFEST (&mt("Zip file generated on [_1]",&Apache::lonlocal::locallocaltime(time()))."\n");
-        print MANIFEST (&mt("Course: [_1]",$env{"course.$courseid.description"})."\n");
-        print MANIFEST (&mt("Problem: [_1]",$res->compTitle)."\n");
-        print MANIFEST (&mt("Files contained in this zip:")."\n");
-    } else {
-        &Apache::lonnet::logthis("Problem making manifest");
+    my @getparts;
+    if (ref($partlist) eq 'ARRAY') {
+        if (@parts) {
+            foreach my $posspart (@{$partlist}) {
+                if (grep(/^\Q$posspart\E$/, at parts)) {
+                    unless (grep(/^\Q$posspart\E$/, at getparts)) {
+                        push(@getparts,$posspart);
+                    }
+                }
+            }
+        } else {
+            @getparts = @{$partlist};
+        }
     }
-    my $file_problem = 0;
-    my $current_student = 0;
-    foreach my $stu (@stuchecked) {
-        $current_student ++;
-        &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,&mt("Processing student [_1] of [_2]",$current_student,$number_of_students));
-        my %files_saved;
-        my ($stuname,$studom,$fullname) = split(/:/,$stu);
-        my %record = &Apache::lonnet::restore($symb,$courseid,$studom,$stuname);
-        my $port_url = '/uploaded/'.$studom.'/'.$stuname.'/portfolio';
-        if ($manifest) {
-            print MANIFEST ($fullname."\n");
+    if (!@getparts) {
+        print(&mt('No problem parts specified for retrieval of submissions.'));
+    } elsif (!$number_of_students) {
+        print(&mt('No students selected for retrieval of submissions.'));
+    } else {
+        my $doc_zip_root = $Apache::lonnet::perlvar{'lonZipDir'};
+        my $manifest;
+        unless (-d "$doc_zip_root/zipdir/$unique_user/$unique_path") {
+            &File::Path::mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path",0,0700);
         }
-         
-        my $submission_count = 0;
-        foreach my $partid (@$partlist) {
-            my @ids = $res->responseIds($partid);
-            foreach my $respid (@ids) {
-                my $part_resp_path = &get_part_resp_path($flat_part,$flat_resp, $partid, $respid);
-                &File::Path::mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path/$stuname/$part_resp_path",0,0700);
-                foreach my $origin ('portfiles','uploadedurl') {
-                    my @files;
-                    if ($record{"resource.$partid.$respid.$origin"} ne '') {
-                        if ($origin eq 'portfiles') {
-                            @files = (split(',',$record{"resource.$partid.$respid.$origin"}));
-                        } else {
-                            @files = ($record{"resource.$partid.$respid.$origin"});
-                        }
-                    }
-                    foreach my $file (@files) {
-                        if ($origin eq 'portfiles') { 
-                            $file = $port_url.$file;
-                        }
-                        my ($file_name_only) = ($file =~ m{.*/([^/]+)$});
-                        if ($manifest) {
-                            print MANIFEST ("\t$file_name_only (".&mt("Part [_1]",$partid).
-                                            ") (".&mt("Response [_1]",$respid).")"."\n");
+        if (open(MANIFEST,'>',"$doc_zip_root/zipdir/$unique_user/$unique_path/manifest.txt")) {
+            $manifest = 1;
+            print MANIFEST (&mt("Zip file generated on [_1]",&Apache::lonlocal::locallocaltime(time()))."\n");
+            print MANIFEST (&mt("Course: [_1]",$env{"course.$courseid.description"})."\n");
+            print MANIFEST (&mt("Problem: [_1]",$res->compTitle)."\n");
+            print MANIFEST (&mt("Files contained in this zip:")."\n");
+        } else {
+            &Apache::lonnet::logthis("Problem making manifest");
+        }
+        my $file_problem = 0;
+        my $current_student = 0;
+        foreach my $stu (@stuchecked) {
+            $current_student ++;
+            &Apache::lonhtmlcommon::Update_PrgWin('',\%prog_state,&mt("Processing student [_1] of [_2]",$current_student,$number_of_students));
+            my %files_saved;
+            my ($stuname,$studom,$fullname) = split(/:/,$stu);
+            my %record = &Apache::lonnet::restore($symb,$courseid,$studom,$stuname);
+            my $port_url = '/uploaded/'.$studom.'/'.$stuname.'/portfolio';
+            if ($manifest) {
+                print MANIFEST ($fullname."\n");
+            }
+
+            my $submission_count = 0;
+            foreach my $partid (@getparts) {
+                my @ids = $res->responseIds($partid);
+                foreach my $respid (@ids) {
+                    my $part_resp_path = &get_part_resp_path($flat_part,$flat_resp, $partid, $respid);
+                    &File::Path::mkpath($doc_zip_root."/zipdir/$unique_user/$unique_path/$stuname/$part_resp_path",0,0700);
+                    foreach my $origin ('portfiles','uploadedurl') {
+                        my @files;
+                        if ($record{"resource.$partid.$respid.$origin"} ne '') {
+                            if ($origin eq 'portfiles') {
+                                @files = (split(',',$record{"resource.$partid.$respid.$origin"}));
+                            } else {
+                                @files = ($record{"resource.$partid.$respid.$origin"});
+                            }
                         }
-                        $submission_count ++;
-                        &Apache::lonnet::repcopy($file);
-                        my $source = &Apache::lonnet::filelocation("",$file);
-                        my $destination = "$doc_zip_root/zipdir/$unique_user/$unique_path/$stuname$part_resp_path/$file_name_only";
-                        if (exists($files_saved{$destination})) {
-                            # file has already been saved once
-                            my ($file_name,$file_ext) = 
-                                ($destination =~ /(^.*)(\..+$)/);
-                            $destination = $file_name.$files_saved{$destination}.$file_ext;
+                        foreach my $file (@files) {
+                            if ($origin eq 'portfiles') { 
+                                $file = $port_url.$file;
+                            }
+                            my ($file_name_only) = ($file =~ m{.*/([^/]+)$});
+                            if ($manifest) {
+                                print MANIFEST ("\t$file_name_only (".&mt("Part [_1]",$partid).
+                                                ") (".&mt("Response [_1]",$respid).")"."\n");
+                            }
+                            $submission_count ++;
+                            &Apache::lonnet::repcopy($file);
+                            my $source = &Apache::lonnet::filelocation("",$file);
+                            my $destination = "$doc_zip_root/zipdir/$unique_user/$unique_path/$stuname$part_resp_path/$file_name_only";
+                            if (exists($files_saved{$destination})) {
+                                # file has already been saved once
+                                my ($file_name,$file_ext) = 
+                                    ($destination =~ /(^.*)(\..+$)/);
+                                $destination = $file_name.$files_saved{$destination}.$file_ext;
+                                $files_saved{$destination}++;
+                            }
                             $files_saved{$destination}++;
-                        }
-                        $files_saved{$destination}++;
-                        if (!&copy($source,$destination)) {
-                            if (!$file_problem) {
-                                print('<br /><span class="LC_error">'.&mt("Unable to create: ")."</span><br />");
-                                $file_problem = 1;
+                            if (!&copy($source,$destination)) {
+                                if (!$file_problem) {
+                                    print('<br /><span class="LC_error">'.&mt("Unable to create: ")."</span><br />");
+                                    $file_problem = 1;
+                                }
+                                print('<span class="LC_filename">'."$stuname/part$partid/resp$respid/$file_name_only".'</span><br />');
                             }
-                            print('<span class="LC_filename">'."$stuname/part$partid/resp$respid/$file_name_only".'</span><br />');
                         }
                     }
                 }
             }
+            if ((!$submission_count) && ($manifest)) {
+                print MANIFEST ("\t".&mt("No Files Submitted")."\n");
+            }
         }
-        if ((!$submission_count) && ($manifest)) {
-            print MANIFEST ("\t".&mt("No Files Submitted")."\n");
+        if ($manifest) {
+            close(MANIFEST);
         }
-    }
-    if ($manifest) {
-        close(MANIFEST);
-    }
-    my $madezip;
-    unless (-d "$doc_zip_root/zipout/$unique_user") {
-        &File::Path::mkpath($doc_zip_root."/zipout/$unique_user",0,0700);
-    }
-    if ((-d "$doc_zip_root/zipout/$unique_user") &&
-        (-d "$doc_zip_root/zipdir/$unique_user/$unique_path")) {
-        if (!-e "$doc_zip_root/zipout/$unique_user/$zipout") {
-             my $zip = Archive::Zip->new();
-             $zip->addTree("$doc_zip_root/zipdir/$unique_user/$unique_path");
-             if ($zip->writeToFileNamed("$doc_zip_root/zipout/$unique_user/$zipout") == AZ_OK) {
-                 $madezip = 1;
-             }
+        my $madezip;
+        unless (-d "$doc_zip_root/zipout/$unique_user") {
+            &File::Path::mkpath($doc_zip_root."/zipout/$unique_user",0,0700);
+        }
+        if ((-d "$doc_zip_root/zipout/$unique_user") &&
+            (-d "$doc_zip_root/zipdir/$unique_user/$unique_path")) {
+            if (!-e "$doc_zip_root/zipout/$unique_user/$zipout") {
+                my $zip = Archive::Zip->new();
+                $zip->addTree("$doc_zip_root/zipdir/$unique_user/$unique_path");
+                if ($zip->writeToFileNamed("$doc_zip_root/zipout/$unique_user/$zipout") == AZ_OK) {
+                    $madezip = 1;
+                }
+            } else {
+                $madezip = 1;
+                # should happen only if user reloads page
+                &Apache::lonnet::logthis("$zipout is already there");
+            }
+            &File::Path::remove_tree("$doc_zip_root/zipdir/$unique_user/$unique_path",{ safe => 1, });
+        }
+        &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);
+        if ($madezip) {
+            print('<p><a href="/zipspool/zipout/'.$unique_user.'/'.$zipout.'">'.
+                  &mt("Click to download").'</a></p><br />');
         } else {
-            $madezip = 1;
-            # should happen only if user reloads page
-            &Apache::lonnet::logthis("$zipout is already there");
-        }
-        &File::Path::remove_tree("$doc_zip_root/zipdir/$unique_user/$unique_path",{ safe => 1, });
-    }
-    &Apache::lonhtmlcommon::Close_PrgWin('',\%prog_state);
-    if ($madezip) {
-        print('<p><a href="/zipspool/zipout/'.$unique_user.'/'.$zipout.'">'.
-             &mt("Click to download").'</a></p><br />');
-    } else {
-        print('<p class="LC_error">'.
-              &mt('Failed to create zip archive of student submissions').
-              '</p>');
+            print('<p class="LC_error">'.
+                  &mt('Failed to create zip archive of student submissions').
+                  '</p>');
+        }
     }
 } else {
     print('<p class="LC_error">'.


More information about the LON-CAPA-cvs mailing list