summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2020-07-19 15:53:28 +0200
committerYorhel <git@yorhel.nl>2020-07-19 15:53:30 +0200
commit52634340d6bad16e0ba922961a334354961bf9a0 (patch)
tree237dec5625979d8d9c0e10dd1299ce45796b8a71 /lib
parentd7767fa0f907e7b2a0a3d879d9000fa137bd81db (diff)
Producers::Edit: v2rw rewrite producer add/edit form
The copy-pasting here is ridiculous. But at the same time, that did allow me to quickly rewrite the form in a single commit. Here's hoping I didn't introduce too many copy-paste errors.
Diffstat (limited to 'lib')
-rw-r--r--lib/VNDB/Handler/Producers.pm8
-rw-r--r--lib/VNWeb/Elm.pm3
-rw-r--r--lib/VNWeb/Producers/Edit.pm120
-rw-r--r--lib/VNWeb/Producers/Elm.pm32
-rw-r--r--lib/VNWeb/VN/Edit.pm1
-rw-r--r--lib/VNWeb/VN/Elm.pm2
6 files changed, 148 insertions, 18 deletions
diff --git a/lib/VNDB/Handler/Producers.pm b/lib/VNDB/Handler/Producers.pm
index d8b2cea1..6e70e512 100644
--- a/lib/VNDB/Handler/Producers.pm
+++ b/lib/VNDB/Handler/Producers.pm
@@ -9,8 +9,8 @@ use VNDB::Types;
TUWF::register(
- qr{p/add} => \&addform,
- qr{p(?:([1-9]\d*)(?:\.([1-9]\d*))?/edit|/new)}
+ qr{old/p/add} => \&addform,
+ qr{old/p(?:([1-9]\d*)(?:\.([1-9]\d*))?/edit|/new)}
=> \&edit,
qr{p/([a-z0]|all)} => \&list,
qr{xml/producers\.xml} => \&pxml,
@@ -68,7 +68,7 @@ sub addform {
end 'div';
}
- $self->htmlForm({ frm => $frm, action => '/p/add', continue => @$l ? 2 : 1 },
+ $self->htmlForm({ frm => $frm, action => '/old/p/add', continue => @$l ? 2 : 1 },
vn_add => [ 'Add a new producer',
[ input => name => 'Name (romaji)', short => 'name' ],
[ input => name => 'Original name', short => 'original' ],
@@ -151,7 +151,7 @@ sub edit {
$self->htmlHeader(title => $title, noindex => 1);
$self->htmlMainTabs('p', $p, 'edit') if $pid;
$self->htmlEditMessage('p', $p, $title);
- $self->htmlForm({ frm => $frm, action => $pid ? "/p$pid/edit" : '/p/new', editsum => 1 },
+ $self->htmlForm({ frm => $frm, action => $pid ? "/old/p$pid/edit" : '/old/p/new', editsum => 1 },
'pedit_geninfo' => [ 'General info',
[ select => name => 'Type', short => 'type',
options => [ map [ $_, $PRODUCER_TYPE{$_} ], keys %PRODUCER_TYPE ] ],
diff --git a/lib/VNWeb/Elm.pm b/lib/VNWeb/Elm.pm
index 55de9c99..13165959 100644
--- a/lib/VNWeb/Elm.pm
+++ b/lib/VNWeb/Elm.pm
@@ -94,6 +94,7 @@ our %apis = (
id => { id => 1 },
name => {},
original => { required => 0, default => '' },
+ hidden => { anybool => 1 },
} } ],
StaffResult => [ { aoh => { # Response to 'Staff'
id => { id => 1 },
@@ -413,6 +414,8 @@ sub write_types {
$data .= def vnLengths => 'List (Int, String)' => list map tuple($_, string $VN_LENGTH{$_}{txt}.($VN_LENGTH{$_}{time}?" ($VN_LENGTH{$_}{time})":'')), keys %VN_LENGTH;
$data .= def vnRelations=> 'List (String, String)' => list map tuple(string $_, string $VN_RELATION{$_}{txt}), keys %VN_RELATION;
$data .= def creditTypes=> 'List (String, String)' => list map tuple(string $_, string $CREDIT_TYPE{$_}), keys %CREDIT_TYPE;
+ $data .= def producerRelations=> 'List (String, String)' => list map tuple(string $_, string $PRODUCER_RELATION{$_}{txt}), keys %PRODUCER_RELATION;
+ $data .= def producerTypes=> 'List (String, String)' => list map tuple(string $_, string $PRODUCER_TYPE{$_}), keys %PRODUCER_TYPE;
$data .= def curYear => Int => (gmtime)[5]+1900;
write_module Types => $data;
diff --git a/lib/VNWeb/Producers/Edit.pm b/lib/VNWeb/Producers/Edit.pm
new file mode 100644
index 00000000..27f922a6
--- /dev/null
+++ b/lib/VNWeb/Producers/Edit.pm
@@ -0,0 +1,120 @@
+package VNWeb::Producers::Edit;
+
+use VNWeb::Prelude;
+
+
+my $FORM = {
+ id => { required => 0, id => 1 },
+ ptype => { enum => \%PRODUCER_TYPE },
+ name => { maxlength => 200 },
+ original => { required => 0, default => '', maxlength => 200 },
+ alias => { required => 0, default => '', maxlength => 500 },
+ lang => { enum => \%LANGUAGE },
+ website => { required => 0, default => '', weburl => 1 },
+ l_wikidata => { required => 0, uint => 1, max => (1<<31)-1 },
+ desc => { required => 0, default => '', maxlength => 5000 },
+ relations => { sort_keys => 'pid', aoh => {
+ pid => { id => 1 },
+ relation => { enum => \%PRODUCER_RELATION },
+ name => { _when => 'out' },
+ original => { _when => 'out', required => 0, default => '' },
+ } },
+ hidden => { anybool => 1 },
+ locked => { anybool => 1 },
+
+ authmod => { _when => 'out', anybool => 1 },
+ editsum => { _when => 'in out', editsum => 1 },
+};
+
+my $FORM_OUT = form_compile out => $FORM;
+my $FORM_IN = form_compile in => $FORM;
+my $FORM_CMP = form_compile cmp => $FORM;
+
+
+TUWF::get qr{/$RE{prev}/edit} => sub {
+ my $e = db_entry p => tuwf->capture('id'), tuwf->capture('rev') or return tuwf->resNotFound;
+ return tuwf->resDenied if !can_edit p => $e;
+
+ $e->{authmod} = auth->permDbmod;
+ $e->{editsum} = $e->{chrev} == $e->{maxrev} ? '' : "Reverted to revision p$e->{id}.$e->{chrev}";
+ $e->{ptype} = delete $e->{type};
+
+ enrich_merge pid => 'SELECT id AS pid, name, original FROM producers WHERE id IN', $e->{relations};
+
+ framework_ title => "Edit $e->{name}", type => 'p', dbobj => $e, tab => 'edit',
+ sub {
+ editmsg_ p => $e, "Edit $e->{name}";
+ elm_ ProducerEdit => $FORM_OUT, $e;
+ };
+};
+
+
+TUWF::get qr{/p/add}, sub {
+ return tuwf->resDenied if !can_edit p => undef;
+
+ framework_ title => 'Add producer',
+ sub {
+ editmsg_ p => undef, 'Add producer';
+ elm_ ProducerEdit => $FORM_OUT, { elm_empty($FORM_OUT)->%*, lang => 'ja' };
+ };
+};
+
+
+elm_api ProducerEdit => $FORM_OUT, $FORM_IN, sub {
+ my $data = shift;
+ my $new = !$data->{id};
+ my $e = $new ? { id => 0 } : db_entry p => $data->{id} or return tuwf->resNotFound;
+ return elm_Unauth if !can_edit p => $e;
+
+ if(!auth->permDbmod) {
+ $data->{hidden} = $e->{hidden}||0;
+ $data->{locked} = $e->{locked}||0;
+ }
+ $data->{desc} = bb_subst_links $data->{desc};
+ $data->{alias} =~ s/\n\n+/\n/;
+
+ $data->{relations} = [] if $data->{hidden};
+ validate_dbid 'SELECT id FROM producers WHERE id IN', map $_->{pid}, $data->{relations}->@*;
+ die "Relation with self" if grep $_->{pid} == $e->{id}, $data->{relations}->@*;
+
+ $e->{ptype} = $e->{type};
+ $data->{type} = $data->{ptype};
+ return elm_Unchanged if !$new && !form_changed $FORM_CMP, $data, $e;
+ my($id,undef,$rev) = db_edit p => $e->{id}, $data;
+ update_reverse($id, $rev, $e, $data);
+ elm_Redirect "/p$id.$rev";
+};
+
+
+sub update_reverse {
+ my($id, $rev, $old, $new) = @_;
+
+ my %old = map +($_->{pid}, $_), $old->{relations} ? $old->{relations}->@* : ();
+ my %new = map +($_->{pid}, $_), $new->{relations}->@*;
+
+ # Updates to be performed, pid => { pid => x, relation => y } or undef if the relation should be removed.
+ my %upd;
+
+ for my $i (keys %old, keys %new) {
+ if($old{$i} && !$new{$i}) {
+ $upd{$i} = undef;
+ } elsif(!$old{$i} || $old{$i}{relation} ne $new{$i}{relation}) {
+ $upd{$i} = {
+ pid => $id,
+ relation => $PRODUCER_RELATION{ $new{$i}{relation} }{reverse},
+ };
+ }
+ }
+
+ for my $i (keys %upd) {
+ my $e = db_entry p => $i;
+ $e->{relations} = [
+ $upd{$i} ? $upd{$i} : (),
+ grep $_->{pid} != $id, $e->{relations}->@*
+ ];
+ $e->{editsum} = "Reverse relation update caused by revision p$id.$rev";
+ db_edit p => $i, $e, 1;
+ }
+}
+
+1;
diff --git a/lib/VNWeb/Producers/Elm.pm b/lib/VNWeb/Producers/Elm.pm
index ea541130..a41f831c 100644
--- a/lib/VNWeb/Producers/Elm.pm
+++ b/lib/VNWeb/Producers/Elm.pm
@@ -2,22 +2,30 @@ package VNWeb::Producers::Elm;
use VNWeb::Prelude;
-elm_api Producers => undef, { search => {} }, sub {
- my $q = shift->{search};
- my $qs = $q =~ s/[%_]//gr;
+elm_api Producers => undef, {
+ search => { type => 'array', values => { required => 0, default => '' } },
+ hidden => { anybool => 1 },
+}, sub {
+ my($data) = @_;
+ my @q = grep length $_, $data->{search}->@*;
+ die "No query" if !@q;
elm_ProducerResult tuwf->dbPagei({ results => 15, page => 1 },
- 'SELECT p.id, p.name, p.original
+ 'SELECT p.id, p.name, p.original, p.hidden
FROM (',
- sql_join('UNION ALL',
- $q =~ /^$RE{pid}$/ ? sql('SELECT 1, id FROM producers WHERE id =', \"$+{id}") : (),
- sql('SELECT 1+substr_score(lower(name),' , \$qs, '), id FROM producers WHERE name ILIKE', \"%$qs%"),
- sql('SELECT 10+substr_score(lower(original),', \$qs, '), id FROM producers WHERE original ILIKE', \"%$qs%"),
- sql('SELECT 100, id FROM producers WHERE alias ILIKE', \"%$qs%"),
- ), ') x(prio, id)
+ sql_join('UNION ALL', map {
+ my $qs = s/[%_]//gr;
+ (
+ /^$RE{pid}$/ ? sql('SELECT 1, id FROM producers WHERE id =', \"$+{id}") : (),
+ sql('SELECT 1+substr_score(lower(name),' , \$qs, '), id FROM producers WHERE name ILIKE', \"%$qs%"),
+ sql('SELECT 10+substr_score(lower(original),', \$qs, "), id FROM producers WHERE translate(original,' ','') ILIKE", \("%$qs%" =~ s/ //gr)),
+ sql('SELECT 100, id FROM producers WHERE alias ILIKE', \"%$qs%"),
+ )
+ } @q),
+ ') x(prio, id)
JOIN producers p ON p.id = x.id
- WHERE NOT p.hidden
- GROUP BY p.id, p.name, p.original
+ WHERE', sql_and($data->{hidden} ? () : 'NOT p.hidden'), '
+ GROUP BY p.id, p.name, p.original, p.hidden
ORDER BY MIN(x.prio), p.name
');
};
diff --git a/lib/VNWeb/VN/Edit.pm b/lib/VNWeb/VN/Edit.pm
index b1172750..048af953 100644
--- a/lib/VNWeb/VN/Edit.pm
+++ b/lib/VNWeb/VN/Edit.pm
@@ -71,7 +71,6 @@ TUWF::get qr{/$RE{vrev}/edit} => sub {
my $e = db_entry v => tuwf->capture('id'), tuwf->capture('rev') or return tuwf->resNotFound;
return tuwf->resDenied if !can_edit v => $e;
- $e->{image_sex} = $e->{image_vio} = undef;
$e->{authmod} = auth->permDbmod;
$e->{editsum} = $e->{chrev} == $e->{maxrev} ? '' : "Reverted to revision v$e->{id}.$e->{chrev}";
diff --git a/lib/VNWeb/VN/Elm.pm b/lib/VNWeb/VN/Elm.pm
index 2ab3ddf2..3aded8e2 100644
--- a/lib/VNWeb/VN/Elm.pm
+++ b/lib/VNWeb/VN/Elm.pm
@@ -25,7 +25,7 @@ elm_api VN => undef, {
') x(prio, id)
JOIN vn v ON v.id = x.id
WHERE', sql_and($data->{hidden} ? () : 'NOT v.hidden'), '
- GROUP BY v.id, v.title, v.original
+ GROUP BY v.id, v.title, v.original, v.hidden
ORDER BY MIN(x.prio), v.title
');
};