[# 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 -]
[$ endif $][$ endif $]