summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2011-02-20 09:03:45 +0100
committerYorhel <git@yorhel.nl>2011-02-20 09:03:45 +0100
commit4884cca9ac061d2ccce87a1d6d912efc3cc04fab (patch)
treeadb2a2fc60a8c738b1981e3056deaa9ae9fa1a45 /lib
parent61282da656bc1a30ed697410906e9c256e38363c (diff)
chardb: Added "group" property to traits
It's more like a cache, and has some unintuitive problems when a trait is applied to multiple top-level traits. But this'll do the trick anyway.
Diffstat (limited to 'lib')
-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
4 files changed, 54 insertions, 12 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;
}