summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2011-02-16 16:14:30 +0100
committerYorhel <git@yorhel.nl>2011-02-16 16:14:30 +0100
commitcd7b3f34173dfeceec03691957c95f4d4ab9cf47 (patch)
tree819817f5e60ef4c8af7b98aba8264b0954970e8b
parent24680d31a5a3433db5fd0140d9cb80b371659342 (diff)
chardb: Added character add/edit form + misc. fixes
-rw-r--r--data/lang.txt99
-rw-r--r--lib/VNDB/DB/Chars.pm13
-rw-r--r--lib/VNDB/DB/Misc.pm1
-rw-r--r--lib/VNDB/Handler/Chars.pm62
-rw-r--r--lib/VNDB/Util/CommonHTML.pm2
-rw-r--r--util/sql/func.sql10
-rw-r--r--util/updates/update_2.19.sql2
7 files changed, 182 insertions, 7 deletions
diff --git a/data/lang.txt b/data/lang.txt
index 80838884..ae605d3a 100644
--- a/data/lang.txt
+++ b/data/lang.txt
@@ -4749,6 +4749,105 @@ nl : Geweigerde tags
#############################################################################
+## Character pages ##
+#############################################################################
+# Handler::Chars
+
+
+# Character diff viewer (/c+.+)
+
+:_revfield_c_name
+en : Name
+ru*:
+cs*:
+hu*:
+nl : Naam
+
+:_revfield_c_original
+en : Original name
+ru*:
+cs*:
+hu*:
+nl : Originele naam
+
+:_revfield_c_alias
+en : Aliasses
+ru*:
+cs*:
+hu*:
+nl : Aliassen
+
+:_revfield_c_desc
+en : Description
+ru*:
+cs*:
+hu*:
+nl : Omschrijving
+
+
+# Add/edit character
+
+:_chare_title_edit
+en : Edit [_1]
+ru : Править [_1]
+cs : Editovat [_1]
+hu : [_1] szerkesztése
+nl : Wijzig [_1]
+
+:_chare_title_add
+en : Add new character
+ru*:
+cs*:
+hu*:
+nl : Nieuwe karakter
+
+:_chare_form_generalinfo
+en : General info
+ru : Основная информация
+cs : Obecné informace
+hu : Általános info
+nl : Algemene info
+
+:_chare_form_name
+en : Name (romaji)
+ru : Название (ромадзи)
+cs : Jméno (romaji)
+hu : Név (romaji)
+nl : Naam (romaji)
+
+:_chare_form_original
+en : Original name
+ru : Исходное название
+cs : Originální jméno
+hu : Eredeti név
+nl : Originele naam
+
+:_chare_form_original_note
+en : The original name of the character, leave blank if it is already in the Latin alphabet.
+ru*:
+cs*:
+hu*:
+nl : De werkelijke naam van het karakter, laat leeg als dit al in het Latijnse alphabet is.
+
+:_chare_form_alias
+en : Aliases
+ru : Прочие названия
+cs : Aliasy
+hu : Más nevek
+nl : Aliassen
+
+:_chare_form_alias_note
+en : (Un)official aliases, separated by a newline.
+ru*:
+cs*:
+hu*:
+nl : (In)officiele aliassen, elke alias op een aparte regel.
+
+
+
+
+
+#############################################################################
## Trait page ##
#############################################################################
# Handler::Traits
diff --git a/lib/VNDB/DB/Chars.pm b/lib/VNDB/DB/Chars.pm
index a1866fcf..b12c4425 100644
--- a/lib/VNDB/DB/Chars.pm
+++ b/lib/VNDB/DB/Chars.pm
@@ -5,7 +5,7 @@ use strict;
use warnings;
use Exporter 'import';
-our @EXPORT = qw|dbCharGet|;
+our @EXPORT = qw|dbCharGet dbCharRevisionInsert|;
# options: id rev what results page
@@ -45,5 +45,16 @@ sub dbCharGet {
}
+# Updates the edit_* tables, used from dbItemEdit()
+# Arguments: { columns in chars_rev },
+sub dbCharRevisionInsert {
+ my($self, $o) = @_;
+
+ my %set = map exists($o->{$_}) ? (qq|"$_" = ?|, $o->{$_}) : (),
+ qw|name original alias desc|;
+ $self->dbExec('UPDATE edit_char !H', \%set) if keys %set;
+}
+
+
1;
diff --git a/lib/VNDB/DB/Misc.pm b/lib/VNDB/DB/Misc.pm
index 5fdad302..4b31ebb4 100644
--- a/lib/VNDB/DB/Misc.pm
+++ b/lib/VNDB/DB/Misc.pm
@@ -40,6 +40,7 @@ sub dbItemEdit {
$self->dbVNRevisionInsert( \%o) if $type eq 'v';
$self->dbProducerRevisionInsert(\%o) if $type eq 'p';
$self->dbReleaseRevisionInsert( \%o) if $type eq 'r';
+ $self->dbCharRevisionInsert( \%o) if $type eq 'c';
return $self->dbRow('SELECT * FROM edit_!s_commit()', $fun);
}
diff --git a/lib/VNDB/Handler/Chars.pm b/lib/VNDB/Handler/Chars.pm
index 2ad1daa3..f593077f 100644
--- a/lib/VNDB/Handler/Chars.pm
+++ b/lib/VNDB/Handler/Chars.pm
@@ -9,6 +9,8 @@ use VNDB::Func;
TUWF::register(
qr{c([1-9]\d*)(?:\.([1-9]\d*))?} => \&page,
+ qr{c(?:([1-9]\d*)(?:\.([1-9]\d*))?/edit|/new)}
+ => \&edit,
);
@@ -50,5 +52,65 @@ sub page {
}
+
+sub edit {
+ my($self, $id, $rev) = @_;
+
+ my $r = $id && $self->dbCharGet(id => $id, what => 'changes extended', $rev ? (rev => $rev) : ())->[0];
+ return $self->resNotFound if $id && !$r->{id};
+ $rev = undef if !$r || $r->{cid} == $r->{latest};
+
+ return $self->htmlDenied if !$self->authCan('charedit')
+ || $id && ($r->{locked} && !$self->authCan('lock') || $r->{hidden} && !$self->authCan('del'));
+
+ my %b4 = !$id ? () : (
+ (map { $_ => $r->{$_} } qw|name original alias desc ihid ilock|),
+ );
+ my $frm;
+
+ if($self->reqMethod eq 'POST') {
+ return if !$self->authCheckCode;
+ $frm = $self->formValidate(
+ { post => 'name', maxlength => 200 },
+ { post => 'original', required => 0, maxlength => 200, default => '' },
+ { post => 'alias', required => 0, maxlength => 500, default => '' },
+ { post => 'desc', required => 0, maxlength => 5000, default => '' },
+ { post => 'editsum', required => 0, maxlength => 5000 },
+ { post => 'ihid', required => 0 },
+ { post => 'ilock', required => 0 },
+ );
+ push @{$frm->{_err}}, 'badeditsum' if !$frm->{editsum} || lc($frm->{editsum}) eq lc($frm->{desc});
+ if(!$frm->{_err}) {
+ $frm->{ihid} = $frm->{ihid} ?1:0;
+ $frm->{ilock} = $frm->{ilock}?1:0;
+
+ return $self->resRedirect("/c$id", 'post')
+ if $id && !grep $frm->{$_} ne $b4{$_}, keys %b4;
+
+ my $nrev = $self->dbItemEdit(c => $id ? $r->{cid} : undef, %$frm);
+ return $self->resRedirect("/c$nrev->{iid}.$nrev->{rev}", 'post');
+ }
+ }
+
+ $frm->{$_} //= $b4{$_} for keys %b4;
+ $frm->{editsum} //= sprintf 'Reverted to revision c%d.%d', $id, $rev if $rev;
+
+ my $title = mt $r ? ('_chare_title_edit', $r->{name}) : '_chare_title_add';
+ $self->htmlHeader(title => $title, noindex => 1);
+ $self->htmlMainTabs('c', $r, 'edit') if $r;
+ $self->htmlEditMessage('c', $r, $title);
+ $self->htmlForm({ frm => $frm, action => $r ? "/c$id/edit" : '/c/new', editsum => 1 },
+ 'chare_geninfo' => [ mt('_chare_form_generalinfo'),
+ [ input => name => mt('_pedit_form_name'), short => 'name' ],
+ [ input => name => mt('_pedit_form_original'), short => 'original' ],
+ [ static => content => mt('_pedit_form_original_note') ],
+ [ text => name => mt('_pedit_form_alias'), short => 'alias', rows => 3 ],
+ [ static => content => mt('_pedit_form_alias_note') ],
+ [ text => name => mt('_pedit_form_desc').'<br /><b class="standout">'.mt('_inenglish').'</b>', short => 'desc', rows => 6 ],
+ ]);
+ $self->htmlFooter;
+}
+
+
1;
diff --git a/lib/VNDB/Util/CommonHTML.pm b/lib/VNDB/Util/CommonHTML.pm
index 0d794913..22e8f13d 100644
--- a/lib/VNDB/Util/CommonHTML.pm
+++ b/lib/VNDB/Util/CommonHTML.pm
@@ -286,7 +286,7 @@ sub htmlEditMessage {
ul;
li; lit mt '_editmsg_msg_guidelines', "/d$guidelines"; end;
if($obj) {
- li; lit mt '_editmsg_msg_discuss', $type eq 'r' ? "/t/v$obj->{vn}[0]{vid}" : "/t/$type$obj->{id}"; end;
+ li; lit mt '_editmsg_msg_discuss', $type eq 'c' ? '/t/db' : $type eq 'r' ? "/t/v$obj->{vn}[0]{vid}" : "/t/$type$obj->{id}"; end;
li; lit mt '_editmsg_msg_history', "/$type$obj->{id}/hist"; end;
} elsif($type ne 'r') {
li; lit mt '_editmsg_msg_search', "/$type/all", $num; end;
diff --git a/util/sql/func.sql b/util/sql/func.sql
index 4fc95165..23ae0fb2 100644
--- a/util/sql/func.sql
+++ b/util/sql/func.sql
@@ -375,7 +375,7 @@ $$ LANGUAGE plpgsql;
-- PLACEHOLDERS, not complete yet
-CREATE OR REPLACE FUNCTION edit_char_init(cid integer) RETURNS void AS $$
+CREATE OR REPLACE FUNCTION edit_char_init(hid integer) RETURNS void AS $$
BEGIN
BEGIN
CREATE TEMPORARY TABLE edit_char (LIKE chars_rev INCLUDING DEFAULTS INCLUDING CONSTRAINTS);
@@ -384,13 +384,13 @@ BEGIN
EXCEPTION WHEN duplicate_table THEN
TRUNCATE edit_char;
END;
- PERFORM edit_revtable('c', cid);
+ PERFORM edit_revtable('c', hid);
-- new char
- IF cid IS NULL THEN
+ IF hid IS NULL THEN
INSERT INTO edit_char DEFAULT VALUES;
-- load revision
ELSE
- INSERT INTO edit_char SELECT name, original, alias, image, "desc" FROM chars_rev WHERE id = cid;
+ INSERT INTO edit_char SELECT name, original, alias, image, "desc" FROM chars_rev WHERE id = hid;
END IF;
END;
$$ LANGUAGE plpgsql;
@@ -663,7 +663,7 @@ $$ LANGUAGE plpgsql;
--- update (vn|release|producer).(hidden|locked) on a new revision
+-- update (vn|release|producer|char).(hidden|locked) on a new revision
-- NOTE: this is a /before/ trigger, it modifies NEW
CREATE OR REPLACE FUNCTION update_hidlock() RETURNS trigger AS $$
DECLARE
diff --git a/util/updates/update_2.19.sql b/util/updates/update_2.19.sql
index 43337ef9..0360feda 100644
--- a/util/updates/update_2.19.sql
+++ b/util/updates/update_2.19.sql
@@ -85,6 +85,8 @@ DROP FUNCTION edit_revtable(dbentry_type, integer);
DROP TYPE dbentry_type;
ALTER TYPE dbentry_type_tmp RENAME TO dbentry_type;
+CREATE TRIGGER hidlock_update BEFORE UPDATE ON chars FOR EACH ROW WHEN (OLD.latest IS DISTINCT FROM NEW.latest) EXECUTE PROCEDURE update_hidlock();
+
-- load the updated functions