[# tag: ewok metadata edit page #] [! use Data::Dumper; use Ewok::Metamap qw(:all); use Ewok::Meta qw(:all); use Ewok::Authz qw(:common); use URI::Escape; use Ewok::Util qw(webfsdir); use Ewok::Locker; !][- Execute({ inputfile => 'util.epl', import => 1 }); $req = shift; $debug = 0; @errors = (); $web_obj = $fdat{web_file} || $fdat{p}; if (! $web_obj) { # Explicitly unspoof user, if required $req->{user} = $ENV{REMOTE_USER} = $ENV{EWOK_USER} if $ENV{EWOK_USER}; $user = 1; $fs_obj = $web_obj = $fdat{user} || $req->{user}; $label = "User preferences"; $authz->{admin} = 1 if authzAdmin($req, $req->{user}); } else { my ($web_dir, $fs_dir, $wd, $filename) = webfsdir($req, $web_obj, { errors => \@errors }); $label = 'Metadata'; if (! @errors) { $fs_obj = "$fs_dir$filename"; $edittext = $fdat{edittext}; $locked = $fdat{locked}; $authz = authzGetUserHash($req, $fs_obj); $dirFlag = (-d $fs_obj); $label = 'Directory metadata' if $dirFlag; } } if (! @errors) { $referer = $fdat{referer} || $ENV{HTTP_REFERER} || '/ewok/fm.html'; $op = $fdat{op}; if ($op =~ m/^Show/) { $all = 1; # Show/hide is sticky - save setting to meta_long_listing in prefs $req->{pref}->{meta_long_listing} = 1; setMeta($req->{pref}, $req->{user}, { type => 'user' }); } elsif ($op =~ m/^Hide/) { $all = 0; # Show/hide is sticky - save setting to meta_long_listing in prefs $req->{pref}->{meta_long_listing} = 0; setMeta($req->{pref}, $req->{user}, { type => 'user' }); } else { $all = exists $fdat{all} ? $fdat{all} : $req->{pref}->{meta_long_listing}; } } # Initialisations $meta = {}; $metamap = undef; $showmeta = 0; -] ewok: [+ "\l$label" +] for [+ $web_obj +] [# Errors #][$ if (@errors) $] [- errors \@errors -] [# Cancel #][$ elsif ($op eq 'Cancel') $][- if ($locked) { my $l = Ewok::Locker->new(); $l->unlock($fs_obj, $req->{user}, { errors => \@errors, altfile => $web_obj }); } $http_headers_out{'Location'} = $referer; -] [# Save #][$ elsif ($op eq 'Save') $] [- # Get values for all non-hidden metadata ($metamap, $keys, $exists) = getMap($user ? 'user' : $fs_obj); $oldmeta = getMeta($fs_obj); @meta_check = (); foreach $key (@$keys) { $prop = $metamap->{$key}; if (defined $prop && ! $prop->{hidden}) { $ftype = $prop->{fieldtype}; VALUE: { my $modify = (defined $prop && ! $prop->{hidden} && (! $prop->{omit} || $all) && (! $prop->{priv} || (ref $authz eq 'HASH' && $authz->{$prop->{priv}}))); # Accept fdat values only for modifiable metadata if ($modify) { if (exists $fdat{$key}) { push @meta_check, $key; $value = ($fdat{$key} eq '' || ($prop->{datatype} eq 'BOOLEAN' && $fdat{$key} == -1)) ? undef : $fdat{$key}; last VALUE; } } $value = $oldmeta->{$key}, last VALUE if exists $oldmeta->{$key}; $value = $prop->{default}, last VALUE if $prop->{default} ne ''; undef $value; } $meta->{$key} = $value; } } # Check all meta_check fields foreach $key (@meta_check) { $prop = $metamap->{$key}; if (defined $prop) { if ($meta->{$key} ne '') { if (! checkType($key, $meta->{$key}, $prop->{datatype}, \$error)) { push @invalid, $key; push @errors, $error; } # If select list, ignore 'N/A' and 'None' values elsif ($prop->{datatype} =~ m/\|/o) { $meta->{$key} = '' if $meta->{$key} =~ m|^N/A$|oi || $meta->{$key} =~ m|^None$|oi; } } elsif ($ftype eq MANDATORY) { push @invalid, $key; push @errors, "Error: $key is mandatory."; } } else { push @errors, "Error: no metadata properties found for $key field."; } } if (@errors) { $showmeta = 1; } else { # Metadata okay - save metadata (and edittext, if defined) if (defined $edittext) { if (! -w $fs_obj) { push @errors, "Error: unable to write to $web_obj."; } elsif (! open EDITTEXT, ">$fs_obj") { push @errors, "Error: unable to open $web_obj."; } else { print EDITTEXT $edittext; close EDITTEXT; } } if (!@errors) { setMeta($meta, $fs_obj, { map => $metamap }); # if ($meta->{post_process}) { # Ewok::Meta::system($meta->{post_process}, $fs_obj, \@errors, 'post-process'); # } if (-d $fs_obj && exists $meta->{auto_index} && $meta->{auto_index} != $fdat{auto_index_in}) { my $delete = ($meta->{auto_index} == 0); Ewok::File::autoindex($fs_obj, \@errors, 1, $delete); } } if (locked) { my $l = Ewok::Locker->new(); $l->unlock($fs_obj, $req->{user}, { altfile => $web_obj }); } } if (!@errors) { $http_headers_out{'Location'} = $referer; } -] [# Else $op not Cancel or Save #][$ else $] [- $showmeta = 1; -] [$ endif $] [# Metadata page #][$ if ($showmeta) $][- ($metamap, $keys, $exists) = getMap($user ? 'user' : $fs_obj) if ! defined $metamap; $meta = getMeta($fs_obj); -] [$ if (! defined $metamap) $][- push @errors, "Error: loading metadata template for '$web_obj' failed."; errors(\@errors); -][$ elsif (! defined $meta) $][- push @errors, "Error: loading metadata for '$web_obj' failed."; errors(\@errors); -] [$ else $]
[+ $label +] for [+ $web_obj +]:
[# Fields labelled in Blue are mandatory.
#] [$ if ($debug) $]
meta: [+ Dumper $meta +]
meta_check: [+ join ',',@meta_check +]
all: [+ $all +]
[$ endif $] [$ if ($locked) $]File locked.
Note: do not use your browser 'Back' key here or the lock on this file will not be removed properly. Use the 'Save' or 'Cancel' buttons below.
[$ endif $] [- errors(\@errors, { h1 => undef }) if @errors -]
[$ if ($exists->{omit}) $] [$ else $] [$ endif $][# $exists->{omit} #] [$ foreach $key (@$keys) $][- $prop = $metamap->{$key}; # Don't include anything hidden, omitted, or not privileged to modify $modify = (defined $prop && ! $prop->{hidden} && (! $prop->{omit} || $all) && (! $prop->{priv} || (ref $authz eq 'HASH' && $authz->{$prop->{priv}}))); -] [$ if ($modify) $] [- # Set value from parameters, existing metadata, or defaults $ftype = $prop->{fieldtype}; VALUE: { # Accept fdat values only for non-fixed and suitably privileged metadata $value = $fdat{$key}, last VALUE if exists $fdat{$key} && $ftype ne 'FIXED' && (! $prop->{priv} || (ref $authz eq 'HASH' && $authz->{$prop->{priv}})); $value = $meta->{$key}, last VALUE if exists $meta->{$key}; $value = $prop->{default}, last VALUE if $prop->{default} ne ''; undef $value; } $auto_index = $value if $key eq 'auto_index'; -] [$ if ($ftype eq 'FIXED') $][+ $value +][$ elsif ($prop->{datatype} eq TEXTLONG) $][$ elsif ($prop->{datatype} eq BOOLEAN) $][$ if (! $dirFlag && ! $user) $] Inherit  [$ endif $] Yes   No  [$ elsif ($prop->{datatype} =~ m/\|/) $][$ else $][$ endif $] [$ endif $][$ endforeach $]
  [$ if ($all) $] [$ else $] [$ endif $]
  [$ if (0 && $ftype eq MANDATORY) $][+ $key +] [$ else $][+ $key +][$ endif $]
[$ if ($user) $] [$ else $] [$ endif $] [$ if defined $edittext $][$ endif $]
[$ endif $][$ endif $]