--- loncom/homework/essayresponse.pm	2008/11/16 02:46:25	1.91
+++ loncom/homework/essayresponse.pm	2009/12/06 20:41:40	1.101.10.1
@@ -1,7 +1,7 @@
 # The LearningOnline Network with CAPA
 # essay (ungraded) style responses
 #
-# $Id: essayresponse.pm,v 1.91 2008/11/16 02:46:25 raeburn Exp $
+# $Id: essayresponse.pm,v 1.101.10.1 2009/12/06 20:41:40 raeburn Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -26,21 +26,6 @@
 # http://www.lon-capa.org/
 #
 
-=pod
-
-=head1 NAME
-
-Apache::easyresponse
-
-=head1 SYNOPSIS
-
-Handler to evaluate essay (ungraded) style responses.
-
-This is part of the LearningOnline Network with CAPA project
-described at http://www.lon-capa.org.
-
-=cut
-
 package Apache::essayresponse;
 use strict;
 use Apache::lonxml();
@@ -66,21 +51,29 @@ sub start_essayresponse {
 	my $coll= &HTML::Entities::encode($Apache::lonhomework::history{"resource.$part.$id.collaborators"},'<>&"');
 	my $uploadedfiletypes= &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes");
         $uploadedfiletypes=~s/[^\w\,]//g;
+        my $maxfilesize=&Apache::lonnet::EXT("resource.$part".'_'."$id.maxfilesize");
+        if (!defined($maxfilesize)) {
+            $maxfilesize = 10.0; #FIXME This should become a domain configuration 
+        }
 	if ( $Apache::lonhomework::type eq 'survey' ) {
 	    $result.= '<input type="hidden" name="HWDRAFT'.$part.'_'.$id.'" value="yes" /> ';
 	}
 	$result.='<br /><table border="1">';
 	if ( $Apache::lonhomework::type ne 'survey' ) {
-	    $result.= '<tr><td>'.
+            if ($env{'request.uri'} eq '/res/gci/gci/internal/submission.problem') {
+                $result .= '<input type="hidden" name="HWDRAFT'.$part.'_'.$id.'" value="yes" />';
+            } else {
+	      $result.= '<tr><td>'.
 		'<label>'.
 		'<input type="radio" name="HWDRAFT'.$part.'_'.$id.'" value="yes" checked="checked" /> '.
 		&mt('Submit entries below as answer to receive credit').
 		'</label> <br />'.
 		'<label>'.
 		'<input type="radio" name="HWDRAFT'.$part.'_'.$id.'" value="no" /> '.
-		&mt('Save entries below as a draft answer (not submitting them for credit yet)').
+		&mt('Save entries below (not submitted for credit yet)').
 		'</label>'.
 		'</td></tr>';
+            }
 	}
 
 	if ($ncol > 0) {
@@ -95,8 +88,14 @@ sub start_essayresponse {
 	    $result .= &check_collaborators($ncol,$coll) if ($coll =~ /\w+/);
 	    $result .='</td></tr>';
 	}
-	$result.=&Apache::inputtags::file_selector($part,$id,
-						   $uploadedfiletypes,'both');
+        my $filesfrom = 'both';
+        my $stuname = &Apache::lonnet::EXT('user.name');
+        my $studom = &Apache::lonnet::EXT('user.domain');
+        if (!&Apache::lonnet::usertools_access($stuname,$studom,'portfolio')) {
+            $filesfrom = 'uploadonly';
+        }
+	$result.=&Apache::inputtags::file_selector($part,$id,$uploadedfiletypes,
+						   $filesfrom,undef,$maxfilesize);
         $result.='</table>';
     } elsif ($target eq 'web' &&
 	     $Apache::inputtags::status[-1] ne 'CAN_ANSWER') {
@@ -208,6 +207,7 @@ sub end_essayresponse {
 
 	if ($target eq 'analyze') {
             $Apache::lonhomework::analyze{"$part.$id.type"} = 'essayresponse';
+            push (@{ $Apache::lonhomework::analyze{"parts"} },"$part.$id");
 	    &Apache::lonhomework::set_bubble_lines();
 	}
     }
@@ -271,7 +271,7 @@ sub file_submission {
         }
         my $uploadedfiletypes= 
             &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes");
-        if ($uploadedfiletypes) {
+        if ($uploadedfiletypes ne '') {
             $uploadedfiletypes=~s/[^\w\,]//g;
             $uploadedfiletypes=','.$uploadedfiletypes.',';
             foreach my $file (@submitted_files) {
@@ -285,10 +285,12 @@ sub file_submission {
                     }
                 }
             }
+        } else {
+            @acceptable_files = @submitted_files;
         }
         my $maxfilesize=&Apache::lonnet::EXT("resource.$part".'_'."$id.maxfilesize");
         if (!$maxfilesize) {
-            $maxfilesize = 100.0; #FIXME This should become a domain configuration
+            $maxfilesize = 10.0; #FIXME This should become a domain configuration
         }
         my %dirlist;
         foreach my $file (@acceptable_files) {
@@ -298,11 +300,14 @@ sub file_submission {
                 }
             } else {
                 my ($symb,$crsid,$udom,$uname) = &Apache::lonnet::whichuser();
-                my ($path,$filename) = ($file =~ m{^(.+)/([^/]+)$});
+                my ($path,$filename) = ($file =~ m{^(.*/)([^/]+)$});
                 my $fullpath = '/userfiles/portfolio'.$path;
                 if (!exists($dirlist{$fullpath})) {
                     my @list = &Apache::lonnet::dirlist($fullpath,$udom,$uname,1);
-                    foreach my $dir_line (@list) {
+                    $dirlist{$fullpath} = \@list;
+                }
+                if (ref($dirlist{$fullpath}) eq 'ARRAY') {
+                    foreach my $dir_line (@{$dirlist{$fullpath}}) {
                         my ($fname,$dom,undef,$testdir,undef,undef,undef,undef,
                             $size,undef,$mtime,undef,undef,undef,$obs,undef) = 
                         split(/\&/,$dir_line,16);
@@ -314,7 +319,6 @@ sub file_submission {
                             last;
                         }
                     }
-                    $dirlist{$fullpath} = \@list;
                 }
             }
             if (ref($totalsize)) {
@@ -323,12 +327,14 @@ sub file_submission {
                     if ($which eq 'filename') {
                         &delete_form_items($jspart,$id);
                     }
+                    last;
+                } else {
+                    push(@accepted_files,$file);
                 }
             } else {
                 push(@accepted_files,$file);
             }
         }
-	my $uploadedfiletypes= &Apache::lonnet::EXT("resource.$part".'_'."$id.uploadedfiletypes");
         $Apache::lonhomework::results{"resource.$part.$id.$which"}=join(',',@accepted_files);
         if (($$award eq 'INVALID_FILETYPE') || ($award eq 'EXCESS_FILESIZE')) {
             return;
@@ -336,8 +342,8 @@ sub file_submission {
 	if (ref($uploadedflag)) {
 	    $$uploadedflag=1;
 	}
+        my ($symb,$crsid,$domain,$name)=&Apache::lonnet::whichuser();
 	if ($which eq 'portfiles') {
-	    my ($symb,$crsid,$domain,$name)=&Apache::lonnet::whichuser();
 	    &Apache::lonnet::unmark_as_readonly($domain,$name,[$symb,$crsid]);
 	    &Apache::lonnet::mark_as_readonly($domain,$name,\@submitted_files,[$symb,$crsid]);
 	    &Apache::lonnet::clear_selected_files($name);
@@ -345,10 +351,40 @@ sub file_submission {
 	if ($which eq 'filename') {
 	    $Apache::lonhomework::results{"resource.$part.$id.uploadedfile"}=
 		$files;
+            my $cleanpart = $part;
+            $cleanpart =~ s/\W/_/g;
+            my $cleanid = $id;
+            $cleanid =~ s/\W/_/g;
+            my ($map,$resid,$res)=&Apache::lonnet::decode_symb($symb);
+            my $container;
+            if ($map =~ /^uploaded/) {
+                (my $prefix,$container) = ($map =~ m{^uploaded/[^/]+/[^/]+/(default|supplemental)_?([^.]*)\.(?:sequence|page)$});
+                if (length($container) > 10) {
+                    $container = substr($container,-10,10);
+                }
+                if ($container ne '') {
+                    $container = $prefix.'_'.$container;
+                } else {
+                    $container = $prefix;
+                } 
+            } else {
+                ($container) = ($map =~ m{(.+)\.(?:sequence|page)$});
+                $container =~ s/\W/_/g;
+                if (length($container) > 255) {
+                    $container = substr($container,0,254);
+                }
+            }
+            my $subdir = 'essayresponse';
+            my %crsdesc = &Apache::lonnet::coursedescription($crsid);
+            foreach my $item ($crsdesc{'domain'},$crsdesc{'num'},$container,$resid,$cleanpart,$cleanid) {
+                if ($item ne '') {
+                    $subdir .= '/'.$item;
+                }
+            }
 	    $Apache::lonhomework::results{"resource.$part.$id.uploadedurl"}=
 		&Apache::lonnet::userfileupload('HWFILE'.$jspart.'_'.$id,undef,
-						'essayresponse');
-            &Apache::lonnet::delenv($env{'form.HWFILE'.$jspart.'_'.$id});
+						$subdir);
+            delete($env{'form.HWFILE'.$jspart.'_'.$id});
 	}
     } elsif ($which eq 'portfiles' &&
 	     $Apache::lonhomework::history{"resource.$part.$id.$which"}) {
@@ -360,9 +396,9 @@ sub file_submission {
 
 sub delete_form_items {
     my ($jspart,$id) = @_;
-    &Apache::lonnet::delenv($env{'form.HWFILE'.$jspart.'_'.$id.'.filename'});
-    &Apache::lonnet::delenv($env{'form.HWFILE'.$jspart.'_'.$id.'.mimetype'});
-    &Apache::lonnet::delenv($env{'form.HWFILE'.$jspart.'_'.$id});
+    delete($env{'form.HWFILE'.$jspart.'_'.$id.'.filename'});
+    delete($env{'form.HWFILE'.$jspart.'_'.$id.'.mimetype'});
+    delete($env{'form.HWFILE'.$jspart.'_'.$id});
 }
 
 
@@ -415,3 +451,37 @@ sub check_collaborators {
 
 1;
 __END__
+
+
+=pod
+
+=head1 NAME
+
+Apache::easyresponse
+
+=head1 SYNOPSIS
+
+Handler to evaluate essay (ungraded) style responses.
+
+This is part of the LearningOnline Network with CAPA project
+described at http://www.lon-capa.org.
+
+=head1 SUBROUTINES
+
+=over 
+
+=item start_essayresponse()
+
+=item end_essayresponse()
+
+=item format_prior_response()
+
+=item file_submission()
+
+=item delete_form_items()
+
+=item check_collaborators()
+
+=back
+
+=cut