summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/VNDB/DB/Chars.pm24
-rw-r--r--lib/VNDB/DB/Traits.pm11
-rw-r--r--lib/VNDB/Handler/Chars.pm4
-rw-r--r--lib/VNDB/Handler/Traits.pm27
-rw-r--r--util/sql/func.sql6
-rw-r--r--util/updates/update_2.19.sql34
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();
-- */