summaryrefslogtreecommitdiff
path: root/lib/VNWeb/Chars/Edit.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/VNWeb/Chars/Edit.pm')
-rw-r--r--lib/VNWeb/Chars/Edit.pm89
1 files changed, 48 insertions, 41 deletions
diff --git a/lib/VNWeb/Chars/Edit.pm b/lib/VNWeb/Chars/Edit.pm
index 392f8f35..5927ccaf 100644
--- a/lib/VNWeb/Chars/Edit.pm
+++ b/lib/VNWeb/Chars/Edit.pm
@@ -6,40 +6,43 @@ use VNWeb::Releases::Lib;
my $FORM = {
- id => { required => 0, id => 1 },
- name => { maxlength => 200 },
- original => { required => 0, default => '', maxlength => 200 },
- alias => { required => 0, default => '', maxlength => 500 },
- desc => { required => 0, default => '', maxlength => 5000 },
+ id => { default => undef, vndbid => 'c' },
+ name => { sl => 1, maxlength => 200 },
+ latin => { default => undef, sl => 1, maxlength => 200 },
+ alias => { default => '', maxlength => 500 },
+ description=> { default => '', maxlength => 5000 },
gender => { default => 'unknown', enum => \%GENDER },
- spoil_gender=>{ required => 0, enum => \%GENDER },
- b_month => { required => 0, default => 0, uint => 1, range => [ 0, 12 ] },
- b_day => { required => 0, default => 0, uint => 1, range => [ 0, 31 ] },
- age => { required => 0, uint => 1, range => [ 0, 32767 ] },
- s_bust => { required => 0, uint => 1, range => [ 0, 32767 ], default => 0 },
- s_waist => { required => 0, uint => 1, range => [ 0, 32767 ], default => 0 },
- s_hip => { required => 0, uint => 1, range => [ 0, 32767 ], default => 0 },
- height => { required => 0, uint => 1, range => [ 0, 32767 ], default => 0 },
- weight => { required => 0, uint => 1, range => [ 0, 32767 ] },
+ spoil_gender=>{ default => undef, enum => \%GENDER },
+ b_month => { default => 0, uint => 1, range => [ 0, 12 ] },
+ b_day => { default => 0, uint => 1, range => [ 0, 31 ] },
+ age => { default => undef, uint => 1, range => [ 0, 32767 ] },
+ s_bust => { default => 0, uint => 1, range => [ 0, 32767 ] },
+ s_waist => { default => 0, uint => 1, range => [ 0, 32767 ] },
+ s_hip => { default => 0, uint => 1, range => [ 0, 32767 ] },
+ height => { default => 0, uint => 1, range => [ 0, 32767 ] },
+ weight => { default => undef, uint => 1, range => [ 0, 32767 ] },
bloodt => { default => 'unknown', enum => \%BLOOD_TYPE },
- cup_size => { required => 0, default => '', enum => \%CUP_SIZE },
- main => { required => 0, id => 1 },
+ cup_size => { default => '', enum => \%CUP_SIZE },
+ main => { default => undef, vndbid => 'c' },
main_spoil => { uint => 1, range => [0,2] },
main_ref => { _when => 'out', anybool => 1 },
main_name => { _when => 'out', default => '' },
- image => { required => 0, vndbid => 'ch' },
- image_info => { _when => 'out', required => 0, type => 'hash', keys => $VNWeb::Elm::apis{ImageResult}[0]{aoh} },
+ image => { default => undef, vndbid => 'ch' },
+ image_info => { _when => 'out', default => undef, type => 'hash', keys => $VNWeb::Elm::apis{ImageResult}[0]{aoh} },
traits => { sort_keys => 'id', aoh => {
- tid => { id => 1 },
+ tid => { vndbid => 'i' },
spoil => { uint => 1, range => [0,2] },
+ lie => { anybool => 1 },
name => { _when => 'out' },
- group => { _when => 'out', required => 0 },
+ group => { _when => 'out', default => undef },
+ hidden => { _when => 'out', anybool => 1 },
+ locked => { _when => 'out', anybool => 1 },
applicable => { _when => 'out', anybool => 1 },
new => { _when => 'out', anybool => 1 },
} },
vns => { sort_keys => ['vid', 'rid'], aoh => {
- vid => { id => 1 },
- rid => { id => 1, required => 0 },
+ vid => { vndbid => 'v' },
+ rid => { vndbid => 'r', default => undef },
spoil => { uint => 1, range => [0,2] },
role => { enum => \%CHAR_ROLE },
title => { _when => 'out' },
@@ -50,7 +53,7 @@ my $FORM = {
authmod => { _when => 'out', anybool => 1 },
editsum => { _when => 'in out', editsum => 1 },
releases => { _when => 'out', aoh => {
- id => { id => 1 },
+ id => { vndbid => 'r' },
rels => $VNWeb::Elm::apis{Releases}[0]
} },
};
@@ -61,18 +64,22 @@ my $FORM_CMP = form_compile cmp => $FORM;
TUWF::get qr{/$RE{crev}/(?<action>edit|copy)} => sub {
- my $e = db_entry c => tuwf->capture('id'), tuwf->capture('rev') or return tuwf->resNotFound;
+ my $e = db_entry tuwf->captures('id', 'rev') or return tuwf->resNotFound;
my $copy = tuwf->capture('action') eq 'copy';
return tuwf->resDenied if !can_edit c => $copy ? {} : $e;
- $e->{main_name} = $e->{main} ? tuwf->dbVali('SELECT name FROM chars WHERE id =', \$e->{main}) : '';
+ $e->{main_name} = $e->{main} ? tuwf->dbVali('SELECT title[1+1] FROM', charst, 'c WHERE id =', \$e->{main}) : '';
$e->{main_ref} = tuwf->dbVali('SELECT 1 FROM chars WHERE main =', \$e->{id})||0;
- enrich_merge tid => 'SELECT t.id AS tid, t.name, t.applicable, g.name AS group, g.order AS order, false AS new FROM traits t LEFT JOIN traits g ON g.id = t.group WHERE t.id IN', $e->{traits};
- $e->{traits} = [ sort { ($a->{order}//99) <=> ($b->{order}//99) || $a->{name} cmp $b->{name} } $e->{traits}->@* ];
+ enrich_merge tid => sql(
+ 'SELECT t.id AS tid, t.name, t.hidden, t.locked, t.applicable, g.name AS group, g.gorder AS order, false AS new
+ FROM traits t
+ LEFT JOIN traits g ON g.id = t.gid
+ WHERE', $copy ? 'NOT t.hidden AND t.applicable AND' : (), 't.id IN'), $e->{traits};
+ $e->{traits} = [ sort { ($a->{order}//99) <=> ($b->{order}//99) || $a->{name} cmp $b->{name} } grep !$copy || $_->{applicable}, $e->{traits}->@* ];
- enrich_merge vid => 'SELECT id AS vid, title FROM vn WHERE id IN', $e->{vns};
- $e->{vns} = [ sort { $a->{title} cmp $b->{title} || $a->{vid} <=> $b->{vid} || ($a->{rid}||0) <=> ($b->{rid}||0) } $e->{vns}->@* ];
+ enrich_merge vid => sql('SELECT id AS vid, title[1+1] AS title, sorttitle FROM', vnt, 'v WHERE id IN'), $e->{vns};
+ $e->{vns} = [ sort { $a->{sorttitle} cmp $b->{sorttitle} || idcmp($a->{vid}, $b->{vid}) || idcmp($a->{rid}||'r0', $b->{rid}||'r0') } $e->{vns}->@* ];
my %vns;
$e->{releases} = [ map !$vns{$_->{vid}}++ ? { id => $_->{vid}, rels => releases_by_vn $_->{vid} } : (), $e->{vns}->@* ];
@@ -85,10 +92,10 @@ TUWF::get qr{/$RE{crev}/(?<action>edit|copy)} => sub {
}
$e->{authmod} = auth->permDbmod;
- $e->{editsum} = $copy ? "Copied from c$e->{id}.$e->{chrev}" : $e->{chrev} == $e->{maxrev} ? '' : "Reverted to revision c$e->{id}.$e->{chrev}";
+ $e->{editsum} = $copy ? "Copied from $e->{id}.$e->{chrev}" : $e->{chrev} == $e->{maxrev} ? '' : "Reverted to revision $e->{id}.$e->{chrev}";
- my $title = ($copy ? 'Copy ' : 'Edit ').$e->{name};
- framework_ title => $title, type => 'c', dbobj => $e, tab => tuwf->capture('action'),
+ my $title = ($copy ? 'Copy ' : 'Edit ').dbobj($e->{id})->{title}[1];
+ framework_ title => $title, dbobj => $e, tab => tuwf->capture('action'),
sub {
editmsg_ c => $e, $title, $copy;
elm_ CharEdit => $FORM_OUT, $copy ? {%$e, id=>undef} : $e;
@@ -98,7 +105,7 @@ TUWF::get qr{/$RE{crev}/(?<action>edit|copy)} => sub {
TUWF::get qr{/$RE{vid}/addchar}, sub {
return tuwf->resDenied if !can_edit c => undef;
- my $v = tuwf->dbRowi('SELECT id, title FROM vn WHERE NOT hidden AND id =', \tuwf->capture('id'));
+ my $v = tuwf->dbRowi('SELECT id, title[1+1] AS title FROM', vnt, 'v WHERE NOT hidden AND id =', \tuwf->capture('id'));
return tuwf->resNotFound if !$v->{id};
my $e = elm_empty($FORM_OUT);
@@ -116,18 +123,18 @@ TUWF::get qr{/$RE{vid}/addchar}, sub {
elm_api CharEdit => $FORM_OUT, $FORM_IN, sub {
my $data = shift;
my $new = !$data->{id};
- my $e = $new ? { id => 0 } : db_entry c => $data->{id} or return tuwf->resNotFound;
+ my $e = $new ? {} : db_entry $data->{id} or return tuwf->resNotFound;
return elm_Unauth if !can_edit c => $e;
if(!auth->permDbmod) {
$data->{hidden} = $e->{hidden}||0;
$data->{locked} = $e->{locked}||0;
}
- $data->{desc} = bb_subst_links $data->{desc};
+ $data->{description} = bb_subst_links $data->{description};
$data->{b_day} = 0 if !$data->{b_month};
$data->{main} = undef if $data->{hidden};
- die "Attempt to set main to self" if $data->{main} && $data->{main} == $e->{id};
+ die "Attempt to set main to self" if $data->{main} && $e->{id} && $data->{main} eq $e->{id};
die "Attempt to set main while this character is already referenced." if $data->{main} && tuwf->dbVali('SELECT 1 AS ref FROM chars WHERE main =', \$e->{id});
# It's possible that the referenced character has been deleted since it was added as main, so don't die() on this one, just unset main.
$data->{main} = undef if $data->{main} && !tuwf->dbVali('SELECT 1 FROM chars WHERE NOT hidden AND main IS NULL AND id =', \$data->{main});
@@ -135,9 +142,9 @@ elm_api CharEdit => $FORM_OUT, $FORM_IN, sub {
validate_dbid 'SELECT id FROM images WHERE id IN', $data->{image} if $data->{image};
- # Allow non-applicable traits only when they were already applied to this character.
+ # Allow non-applicable or non-approved traits only when they were already applied to this character.
validate_dbid
- sql('SELECT id FROM traits t WHERE state = 1+1 AND (applicable OR EXISTS(SELECT 1 FROM chars_traits ct WHERE ct.tid = t.id AND ct.id =', \$e->{id}, ')) AND id IN'),
+ sql('SELECT id FROM traits t WHERE ((NOT hidden AND applicable) OR EXISTS(SELECT 1 FROM chars_traits ct WHERE ct.tid = t.id AND ct.id =', \$e->{id}, ')) AND id IN'),
map $_->{tid}, $data->{traits}->@*;
validate_dbid 'SELECT id FROM vn WHERE id IN', map $_->{vid}, $data->{vns}->@*;
@@ -145,12 +152,12 @@ elm_api CharEdit => $FORM_OUT, $FORM_IN, sub {
# and the char hasn't been updated yet. Would be nice to give a better
# error message in that case.
for($data->{vns}->@*) {
- die "Bad release for v$_->{vid}: r$_->{rid}\n" if defined $_->{rid} && !tuwf->dbVali('SELECT 1 FROM releases_vn WHERE id =', \$_->{rid}, 'AND vid =', \$_->{vid});
+ die "Bad release for $_->{vid}: $_->{rid}\n" if defined $_->{rid} && !tuwf->dbVali('SELECT 1 FROM releases_vn WHERE id =', \$_->{rid}, 'AND vid =', \$_->{vid});
}
return elm_Unchanged if !$new && !form_changed $FORM_CMP, $data, $e;
- my($id,undef,$rev) = db_edit c => $e->{id}, $data;
- elm_Redirect "/c$id.$rev";
+ my $ch = db_edit c => $e->{id}, $data;
+ elm_Redirect "/$ch->{nitemid}.$ch->{nrev}";
};
1;