--- loncom/lonnet/perl/lonnet.pm 2004/11/03 00:11:42 1.559 +++ loncom/lonnet/perl/lonnet.pm 2004/11/08 18:04:17 1.563 @@ -1,7 +1,7 @@ # The LearningOnline Network # TCP networking package # -# $Id: lonnet.pm,v 1.559 2004/11/03 00:11:42 banghart Exp $ +# $Id: lonnet.pm,v 1.563 2004/11/08 18:04:17 banghart Exp $ # # Copyright Michigan State University Board of Trustees # @@ -3786,20 +3786,65 @@ sub diskusage { sub mark_as_readonly { my ($domain,$user,$files,$what) = @_; my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); - foreach my $file ($files) { - $current_permissions{$file}.=':'.$what.':'; + foreach my $file (@{$files}) { + push(@{$current_permissions{$file}},$what); } - &Apache::lonnet::put('file_permissions',{ 'locked_files' => %current_permissions },$domain,$user); + &Apache::lonnet::put('file_permissions',\%current_permissions,$domain,$user); return; } +#--------------------------------------------------------------Get Marked as Read Only + +sub get_marked_as_readonly { + my ($domain,$user,$what) = @_; + my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); + my @readonly_files; + while (my ($file_name,$value) = each(%current_permissions)) { + &logthis("found $file_name"); + if (ref($value) eq "ARRAY"){ + &logthis("found array"); + foreach my $stored_what (@{$value}) { + if ($stored_what eq $what) { + push(@readonly_files, $file_name); + &logthis("defined pushed $file_name"); + } elsif (!defined($what)) { + push(@readonly_files, $file_name); + &logthis("undef pushed $file_name"); + } + } + } + } + return @readonly_files; +} + # ------------------------------------------------------------ Unmark as Read Only sub unmark_as_readonly { - my ($domain,$user,$file,$what) = @_; - my $current_permissions = &Apache::lonnet::get('file_permissions',$file,$domain,$user); - $current_permissions =~ s/:$file://; - &Apache::lonnet::put('file_permissions',{ $file => $current_permissions },$domain,$user); + # unmarks all files locked by $what + # for portfolio submissions, $what contains $crsid and $symb + my ($domain,$user,$what) = @_; + my %current_permissions = &Apache::lonnet::dump('file_permissions',$domain,$user); + my @readonly_files = &Apache::lonnet::get_marked_as_readonly($domain,$user,$what); + foreach my $file(@readonly_files){ + my $current_locks = $current_permissions{$file}; + my @new_locks; + my @del_keys; + if (ref($current_locks) eq "ARRAY"){ + foreach my $locker (@{$current_locks}) { + unless ($locker eq $what) { + push(@new_locks, $what); + } + } + if (@new_locks > 0) { + $current_permissions{$file} = \@new_locks; + } else { + push(@del_keys, $file); + &Apache::lonnet::del('file_permissions',\@del_keys, $domain, $user); + delete $current_permissions{$file}; + } + } + } + &Apache::lonnet::put('file_permissions',\%current_permissions,$domain,$user); return; } @@ -4844,10 +4889,16 @@ sub get_rand_alg { return &latest_rnd_algorithm_id(); } +sub validCODE { + my ($CODE)=@_; + if (defined($CODE) && $CODE ne '' && $CODE =~ /^\w+$/) { return 1; } + return 0; +} + sub getCODE { - if (defined($ENV{'form.CODE'})) { return $ENV{'form.CODE'}; } + if (&validCODE($ENV{'form.CODE'})) { return $ENV{'form.CODE'}; } if (defined($Apache::lonhomework::parsing_a_problem) && - defined($Apache::lonhomework::history{'resource.CODE'})) { + &validCODE($Apache::lonhomework::history{'resource.CODE'})) { return $Apache::lonhomework::history{'resource.CODE'}; } return undef;