diff options
author | Yorhel <git@yorhel.nl> | 2011-02-16 16:14:30 +0100 |
---|---|---|
committer | Yorhel <git@yorhel.nl> | 2011-02-16 16:14:30 +0100 |
commit | cd7b3f34173dfeceec03691957c95f4d4ab9cf47 (patch) | |
tree | 819817f5e60ef4c8af7b98aba8264b0954970e8b | |
parent | 24680d31a5a3433db5fd0140d9cb80b371659342 (diff) |
chardb: Added character add/edit form + misc. fixes
-rw-r--r-- | data/lang.txt | 99 | ||||
-rw-r--r-- | lib/VNDB/DB/Chars.pm | 13 | ||||
-rw-r--r-- | lib/VNDB/DB/Misc.pm | 1 | ||||
-rw-r--r-- | lib/VNDB/Handler/Chars.pm | 62 | ||||
-rw-r--r-- | lib/VNDB/Util/CommonHTML.pm | 2 | ||||
-rw-r--r-- | util/sql/func.sql | 10 | ||||
-rw-r--r-- | util/updates/update_2.19.sql | 2 |
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 |