From: Mike Taylor Date: Wed, 29 Nov 2006 18:22:08 +0000 (+0000) Subject: Big, big rewrite. Not only does it now work properly in all three X-Git-Tag: CPAN-v1.02~745 X-Git-Url: http://sru.miketaylor.org.uk/cgi-bin?a=commitdiff_plain;h=02fdc2909253e8bab7022b9dcd7f6bc060b5c67d;p=irspy-moved-to-github.git Big, big rewrite. Not only does it now work properly in all three modes (New, Edit, Copy) and in all three phases (initial form, rejected submission, accepted submission), but the code that does work is rather simpler than the old code that didn't. --- diff --git a/web/htdocs/details/edit.mc b/web/htdocs/details/edit.mc index 1d789f0..7b3e6d7 100644 --- a/web/htdocs/details/edit.mc +++ b/web/htdocs/details/edit.mc @@ -1,43 +1,55 @@ -%# $Id: edit.mc,v 1.20 2006-11-17 22:39:17 mike Exp $ +%# $Id: edit.mc,v 1.21 2006-11-29 18:22:08 mike Exp $ +<%args> +$op +$id => undef +$update => undef + <%doc> Since this form is used in many different situations, some care is merited in considering the possibilities: -New? Copy ID? Situation --------------------------------------------------------------------------- -Y Blank form for adding a new target. -Y New target submitted successfully. -Y Partial new target submitted, requiring more - - Y Existing target to be edited. - Y Existing target has been updated. +Situation Op ID Update +---------------------------------------------------------------------- +Blank form for adding a new target new +New target rejected, changes required new X +New target accepted and added new X +--------------------------------------------------------------------- +Existing target to be edited edit X +Edit rejected, changes required edit X X +Target successfully updated edit X X +---------------------------------------------------------------------- +Existing target to be copied copy X +New target rejected, changes required copy X X +New target accepted and added copy X X +---------------------------------------------------------------------- - Y Y Existing target to be copied. - Y New or copied target rejected due to duplicate ID. --------------------------------------------------------------------------- +Submissions, whether of new targets, edits or copies, may be rejected +due either to missing mandatory fields or host/name/port that form a +duplicate ID. -<%args> -$new => undef -$copy => undef -$id => undef - <%perl> +# Sanity checking +die "op = new but id defined" if $op eq "new" && defined $id; +die "op != new but id undefined" if $op ne "new" && !defined $id; + my $conn = new ZOOM::Connection("localhost:3313/IR-Explain---1", 0, user => "admin", password => "fruitbat", elementSetName => "zeerex"); my $rec = ''; -if (defined $id && $id ne "") { +if (defined $id && ($op ne "copy" || !$update)) { # Existing record my $query = 'rec.id="' . cql_quote($id) . '"'; my $rs = $conn->search(new ZOOM::Query::CQL($query)); if ($rs->size() > 0) { $rec = $rs->record(0); } else { + ### Is this an error? I don't think the UI will ever provoke it + print qq[

(New ID specified.)

\n]; $id = undef; } } else { - # New record + # No ID supplied -- this is a brand new record my $host = $r->param("host"); my $port = $r->param("port"); my $dbname = $r->param("dbname"); @@ -45,8 +57,8 @@ if (defined $id && $id ne "") { !defined $port || $port eq "" || !defined $dbname || $dbname eq "") { print qq[

-You must specify host, port and database name.

\n]; - $r->param(update => 0); +You must specify host, port and database name.

\n] if $update; + undef $update; } else { my $query = cql_target($host, $port, $dbname); my $rs = $conn->search(new ZOOM::Query::CQL($query)); @@ -54,9 +66,10 @@ You must specify host, port and database name.

\n]; my $fakeid = xml_encode(uri_escape("$host:$port/$dbname")); print qq[

There is already -a record +a record for this host, port and database name.

\n]; + undef $update; } } } @@ -98,31 +111,32 @@ my @fields = qw(e:title e:description) ], ); -my $nchanges = 0; -my $update = $r->param("update"); - - # Update record with submitted data - my %fieldsByKey = map { ( $_->[0], $_) } @fields; - my %data; - foreach my $key ($r->param()) { - next if grep { $key eq $_ } qw(id update new copy); - $data{$key} = $r->param($key); - } - my $mynchanges = modify_xml_document($xc, \%fieldsByKey, \%data); - -if ($update) { - $nchanges = $mynchanges; - if ($nchanges) { - ### Set e:metaInfo/e:dateModified - } +# Update record with submitted data +my %fieldsByKey = map { ( $_->[0], $_) } @fields; +my %data; +foreach my $key ($r->param()) { + next if grep { $key eq $_ } qw(op id update); + $data{$key} = $r->param($key); +} +my @changedFields = modify_xml_document($xc, \%fieldsByKey, \%data); +if ($update && @changedFields) { + my @x = modify_xml_document($xc, { dateModified => + [ dateModified => 0, + "Data/time modified", + "e:metaInfo/e:dateModified" ] }, + { dateModified => isodate(time()) }); + die "Didn't set dateModified!" if !@x; ZOOM::IRSpy::_really_rewrite_record($conn, $xc->getContextNode()); } +

<% xml_encode($xc->find("e:databaseInfo/e:title"), "[Untitled]") %>

-% if ($nchanges) { +% if ($update && @changedFields) { +% my $nchanges = @changedFields;

- The record has been <% $new ? "created" : "updated" %>.
- Changed <% $nchanges %> field<% $nchanges == 1 ? "" : "s" %>. + The record has been <% $op ne "edit" ? "created" : "updated" %>.
+ Changed <% $nchanges %> field<% $nchanges == 1 ? "" : "s" %>: + <% join(", ", map { xml_encode($_->[2]) } @changedFields) %>.

% }
@@ -134,20 +148,20 @@ foreach my $ref (@fields) { <% $caption %> -% my $rawdata = $xc->findvalue($xpath); -% my $data = xml_encode($rawdata, ""); +% my $rawval = $xc->findvalue($xpath); +% my $val = xml_encode($rawval, ""); % if (ref $nlines) { % } elsif ($nlines) { - + % } else { - + % } @@ -155,20 +169,16 @@ foreach my $ref (@fields) { + % if (defined $id) { -% } else { - -% } -% if (defined $copy) { - % }
<%perl> - if ($nchanges && 0) { + if (@changedFields && 0) { my $x = $xc->getContextNode()->toString(); $x = xml_encode($x); #$x =~ s/$//gm;