diff options
-rw-r--r-- | lib/VNDB/DB/Chars.pm | 24 | ||||
-rw-r--r-- | lib/VNDB/DB/Traits.pm | 11 | ||||
-rw-r--r-- | lib/VNDB/Handler/Chars.pm | 4 | ||||
-rw-r--r-- | lib/VNDB/Handler/Traits.pm | 27 | ||||
-rw-r--r-- | util/sql/func.sql | 6 | ||||
-rw-r--r-- | util/updates/update_2.19.sql | 34 |
6 files changed, 78 insertions, 28 deletions
diff --git a/lib/VNDB/DB/Chars.pm b/lib/VNDB/DB/Chars.pm index 51726ec6..fbdf7e1f 100644 --- a/lib/VNDB/DB/Chars.pm +++ b/lib/VNDB/DB/Chars.pm @@ -9,7 +9,7 @@ our @EXPORT = qw|dbCharGet dbCharRevisionInsert dbCharImageId|; # options: id rev what results page -# what: extended changes +# what: extended traits changes sub dbCharGet { my $self = shift; my %o = ( @@ -25,9 +25,9 @@ sub dbCharGet { $o{rev} ? ( 'h.rev = ?' => $o{rev} ) : (), ); - my @select = qw|c.id cr.name cr.original|; + my @select = (qw|c.id cr.name cr.original|, 'cr.id AS cid'); push @select, qw|c.hidden c.locked cr.alias cr.desc cr.image cr.b_month cr.b_day cr.s_bust cr.s_waist cr.s_hip cr.height cr.weight cr.bloodt| if $o{what} =~ /extended/; - push @select, qw|h.requester h.comments c.latest u.username h.rev h.ihid h.ilock|, "extract('epoch' from h.added) as added", 'cr.id AS cid' if $o{what} =~ /changes/; + push @select, qw|h.requester h.comments c.latest u.username h.rev h.ihid h.ilock|, "extract('epoch' from h.added) as added" if $o{what} =~ /changes/; my @join; push @join, $o{rev} ? 'JOIN chars c ON c.id = cr.cid' : 'JOIN chars c ON cr.id = c.latest'; @@ -39,7 +39,23 @@ sub dbCharGet { FROM chars_rev cr !s !W|, - join(', ', @select), join(' ', @join), \%where); + join(', ', @select), join(' ', @join), \%where + ); + + if(@$r && $o{what} =~ /traits/) { + my %r = map { + $_->{traits} = []; + ($_->{cid}, $_->{traits}) + } @$r; + + push @{$r{ delete $_->{cid} }}, $_ for (@{$self->dbAll(q| + SELECT ct.cid, ct.tid, ct.spoil, t.name, t."group", tg.name AS groupname + FROM chars_traits ct + JOIN traits t ON t.id = ct.tid + LEFT JOIN traits tg ON tg.id = t."group" + WHERE cid IN(!l)|, [ keys %r ] + )}); + } return wantarray ? ($r, $np) : $r; } diff --git a/lib/VNDB/DB/Traits.pm b/lib/VNDB/DB/Traits.pm index 8bbcdbf3..8d74862f 100644 --- a/lib/VNDB/DB/Traits.pm +++ b/lib/VNDB/DB/Traits.pm @@ -38,11 +38,12 @@ sub dbTraitGet { ); my @select = ( - qw|t.id t.meta t.name t.description t.state t.alias|, - q|extract('epoch' from t.added) as added|, + qw|t.id t.meta t.name t.description t.state t.alias t."group" |, + 'tg.name AS groupname', q|extract('epoch' from t.added) as added|, $o{what} =~ /addedby/ ? ('t.addedby', 'u.username') : (), ); my @join = $o{what} =~ /addedby/ ? 'JOIN users u ON u.id = t.addedby' : (); + push @join, 'LEFT JOIN traits tg ON tg.id = t."group"'; my $order = sprintf { id => 't.id %s', @@ -105,7 +106,7 @@ sub dbTraitEdit { $self->dbExec('UPDATE traits !H WHERE id = ?', { $o{upddate} ? ('added = NOW()' => 1) : (), - map exists($o{$_}) ? ("$_ = ?" => $o{$_}) : (), qw|name meta description state alias| + map exists($o{$_}) ? ("\"$_\" = ?" => $o{$_}) : (), qw|name meta description state alias group| }, $id); if($o{parents}) { $self->dbExec('DELETE FROM traits_parents WHERE trait = ?', $id); @@ -118,8 +119,8 @@ sub dbTraitEdit { # returns the id of the new trait sub dbTraitAdd { my($self, %o) = @_; - my $id = $self->dbRow('INSERT INTO traits (name, meta, description, state, alias, addedby) VALUES (!l, ?) RETURNING id', - [ map $o{$_}, qw|name meta description state alias| ], $o{addedby}||$self->authInfo->{id} + my $id = $self->dbRow('INSERT INTO traits (name, meta, description, state, alias, "group", addedby) VALUES (!l, ?) RETURNING id', + [ map $o{$_}, qw|name meta description state alias group| ], $o{addedby}||$self->authInfo->{id} )->{id}; $self->dbExec('INSERT INTO traits_parents (trait, parent) VALUES (?, ?)', $id, $_) for(@{$o{parents}}); return $id; diff --git a/lib/VNDB/Handler/Chars.pm b/lib/VNDB/Handler/Chars.pm index 6e466149..9aaf46cf 100644 --- a/lib/VNDB/Handler/Chars.pm +++ b/lib/VNDB/Handler/Chars.pm @@ -19,7 +19,7 @@ sub page { my $r = $self->dbCharGet( id => $id, - what => 'extended'.($rev ? ' changes' : ''), + what => 'extended traits'.($rev ? ' changes' : ''), $rev ? ( rev => $rev ) : () )->[0]; return $self->resNotFound if !$r->{id}; @@ -29,7 +29,7 @@ sub page { return if $self->htmlHiddenMessage('c', $r); if($rev) { - my $prev = $rev && $rev > 1 && $self->dbCharGet(id => $id, rev => $rev-1, what => 'changes extended')->[0]; + my $prev = $rev && $rev > 1 && $self->dbCharGet(id => $id, rev => $rev-1, what => 'changes extended traits')->[0]; $self->htmlRevision('c', $prev, $r, [ name => diff => 1 ], [ original => diff => 1 ], diff --git a/lib/VNDB/Handler/Traits.pm b/lib/VNDB/Handler/Traits.pm index da5928bc..6beaab94 100644 --- a/lib/VNDB/Handler/Traits.pm +++ b/lib/VNDB/Handler/Traits.pm @@ -81,7 +81,7 @@ sub traitedit { if($act && $act eq 'add') { $par = $self->dbTraitGet(id => $trait)->[0]; return $self->resNotFound if !$par; - $frm->{parents} = $par->{name}; + $frm->{parents} = $par->{id}; $trait = undef; } @@ -101,10 +101,12 @@ sub traitedit { { post => 'parents', required => !$self->authCan('tagmod'), default => '', regex => [ qr/^(?:$|(?:[1-9]\d*)(?: +[1-9]\d*)*)$/, 'Parent traits must be a space-separated list of trait IDs' ] }, ); my @parents = split /[\t ]+/, $frm->{parents}; + my $group = undef; if(!$frm->{_err}) { for(@parents) { my $c = $self->dbTraitGet(id => $_); push @{$frm->{_err}}, [ 'parents', 'func', [ 0, mt '_tagedit_err_notfound', $_ ]] if !@$c; + $group //= $c->[0]{group}||$c->[0]{id} if @$c; } } @@ -117,11 +119,13 @@ sub traitedit { meta => $frm->{meta}?1:0, alias => $frm->{alias}, parents => \@parents, + group => $group, ); if(!$trait) { $trait = $self->dbTraitAdd(%opts); } else { $self->dbTraitEdit($trait, %opts, upddate => $frm->{state} == 2 && $t->{state} != 2) if $trait; + _set_childs_group($self, $trait, $group||$trait) if ($group||0) != ($t->{group}); } $self->resRedirect("/i$trait", 'post'); return; @@ -167,6 +171,22 @@ sub traitedit { $self->htmlFooter; } +# recursively edit all child traits and set the group field +sub _set_childs_group { + my($self, $trait, $group) = @_; + my %done; + + my $e; + $e = sub { + my $l = shift; + for (@$l) { + $self->dbTraitEdit($_->{id}, group => $group) if !$done{$_->{id}}++; + $e->($_->{sub}) if $_->{sub}; + } + }; + $e->($self->dbTraitTree($trait, 25)); +} + sub traitlist { my $self = shift; @@ -222,6 +242,9 @@ sub traitlist { Tr $n % 2 ? (class => 'odd') : (); td class => 'tc1', $self->{l10n}->age($l->{added}); td class => 'tc3'; + if($l->{group}) { + b class => 'grayedout', $l->{groupname}.' / '; + } a href => "/i$l->{id}", $l->{name}; if($f->{t} == -1) { b class => 'grayedout', ' '.mt '_traitb_note_awaiting' if $l->{state} == 0; @@ -264,6 +287,7 @@ sub traitindex { li; txt $self->{l10n}->age($_->{added}); txt ' '; + b class => 'grayedout', $_->{groupname}.' / ' if $_->{group}; a href => "/i$_->{id}", $_->{name}; end; } @@ -286,6 +310,7 @@ sub traitindex { li; txt $self->{l10n}->age($_->{added}); txt ' '; + b class => 'grayedout', $_->{groupname}.' / ' if $_->{group}; a href => "/i$_->{id}", $_->{name}; end; } diff --git a/util/sql/func.sql b/util/sql/func.sql index aa453350..0938f76d 100644 --- a/util/sql/func.sql +++ b/util/sql/func.sql @@ -379,8 +379,10 @@ BEGIN CREATE TEMPORARY TABLE edit_char (LIKE chars_rev INCLUDING DEFAULTS INCLUDING CONSTRAINTS); ALTER TABLE edit_char DROP COLUMN id; ALTER TABLE edit_char DROP COLUMN cid; + CREATE TEMPORARY TABLE edit_char_traits (LIKE chars_traits INCLUDING DEFAULTS INCLUDING CONSTRAINTS); + ALTER TABLE edit_char_traits DROP COLUMN cid; EXCEPTION WHEN duplicate_table THEN - TRUNCATE edit_char; + TRUNCATE edit_char, edit_char_traits; END; PERFORM edit_revtable('c', hid); -- new char @@ -389,6 +391,7 @@ BEGIN -- load revision ELSE INSERT INTO edit_char SELECT name, original, alias, image, "desc", s_bust, s_waist, s_hip, b_month, b_day, height, weight,bloodt FROM chars_rev WHERE id = hid; + INSERT INTO edit_char_traits SELECT tid, spoil FROM chars_traits WHERE cid = hid; END IF; END; $$ LANGUAGE plpgsql; @@ -404,6 +407,7 @@ BEGIN END IF; SELECT INTO r * FROM edit_commit(); INSERT INTO chars_rev SELECT r.cid, r.iid, name, original, alias, image, "desc", s_bust, s_waist, s_hip, b_month, b_day, height, weight, bloodt FROM edit_char; + INSERT INTO chars_traits SELECT r.cid, tid, spoil FROM edit_char_traits; UPDATE chars SET latest = r.cid WHERE id = r.iid; RETURN r; END; diff --git a/util/updates/update_2.19.sql b/util/updates/update_2.19.sql index 88058006..14c3e30e 100644 --- a/util/updates/update_2.19.sql +++ b/util/updates/update_2.19.sql @@ -11,8 +11,10 @@ CREATE TABLE traits ( meta boolean NOT NULL DEFAULT false, added timestamptz NOT NULL DEFAULT NOW(), state smallint NOT NULL DEFAULT 0, - addedby integer NOT NULL DEFAULT 0 REFERENCES users (id) + addedby integer NOT NULL DEFAULT 0 REFERENCES users (id), + "group" integer ); +ALTER TABLE traits ADD FOREIGN KEY ("group") REFERENCES traits (id); CREATE TABLE traits_parents ( trait integer NOT NULL REFERENCES traits (id), @@ -97,21 +99,22 @@ CREATE TRIGGER chars_rev_image_notify AFTER INSERT OR UPDATE ON chars_rev /* Debugging data *-/ + -- some traits, based on Echo's draft -INSERT INTO traits (name, meta, state, addedby) VALUES - ('Hair', true, 2, 2), - ('Hair Color', true, 2, 2), - ('Auburn', false, 2, 2), - ('Black', false, 2, 2), - ('Blond', false, 2, 2), - ('Brown', false, 2, 2), - ('Hairstyle', true, 2, 2), - ('Bun', false, 2, 2), - ('Odango', false, 2, 2), - ('Ponytail', false, 2, 2), - ('Twin Tails', false, 2, 2), - ('Short', false, 2, 2), - ('Straight', false, 2, 2); +INSERT INTO traits (name, meta, state, addedby, "group") VALUES + ('Hair', true, 2, 2, NULL), + ('Hair Color', true, 2, 2, 1), + ('Auburn', false, 2, 2, 1), + ('Black', false, 2, 2, 1), + ('Blond', false, 2, 2, 1), + ('Brown', false, 2, 2, 1), + ('Hairstyle', true, 2, 2, 1), + ('Bun', false, 2, 2, 1), + ('Odango', false, 2, 2, 1), + ('Ponytail', false, 2, 2, 1), + ('Twin Tails', false, 2, 2, 1), + ('Short', false, 2, 2, 1), + ('Straight', false, 2, 2, 1); INSERT INTO traits_parents (trait, parent) VALUES (2, 1), (3, 2), @@ -138,6 +141,7 @@ SELECT edit_char_commit(); SELECT edit_char_init(null); UPDATE edit_revision SET comments = '2nd test entry', requester = 2, ip = '0.0.0.0'; UPDATE edit_char SET name = 'Saya', original = '沙耶', "desc" = 'There is more than meets the eye!', alias = 'Cute monster', height = 140, weight = 52, s_bust = 41, s_waist = 38, s_hip = 40, b_month = 3, b_day = 15, bloodt = 'a'; +INSERT INTO edit_char_traits VALUES (4, 0), (12, 0); SELECT edit_char_commit(); -- */ |