From 5c0143d7da6e57b8040396ee2681f8251a3c88ef Mon Sep 17 00:00:00 2001 From: Yorhel Date: Sat, 4 Jul 2009 15:58:17 +0200 Subject: Implemented copy-add release feature --- ChangeLog | 1 + lib/VNDB/Handler/Releases.pm | 42 +++++++++++++++++++++++++----------------- lib/VNDB/Util/CommonHTML.pm | 20 ++++++++++++++++++-- lib/VNDB/Util/FormHTML.pm | 1 + 4 files changed, 45 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index cc16fa39..f1e6d6c1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -3,6 +3,7 @@ - Display related boards in recent posts tooltip op homepage - Added search box on user list - Proper support for multilingual releases + - Copy-add release feature 2.4 - 2009-06-07 - Release search + browser + filters diff --git a/lib/VNDB/Handler/Releases.pm b/lib/VNDB/Handler/Releases.pm index ba46d19f..6b9de1f0 100644 --- a/lib/VNDB/Handler/Releases.pm +++ b/lib/VNDB/Handler/Releases.pm @@ -11,7 +11,7 @@ YAWF::register( qr{r([1-9]\d*)(?:\.([1-9]\d*))?} => \&page, qr{(v)([1-9]\d*)/add} => \&edit, qr{r} => \&browse, - qr{r(?:([1-9]\d*)(?:\.([1-9]\d*))?/edit)} + qr{r(?:([1-9]\d*)(?:\.([1-9]\d*))?/(edit|copy))} => \&edit, ); @@ -260,12 +260,14 @@ sub _infotable { } -# rid = \d -> edit release +# rid = \d -> edit/copy release # rid = 'v' -> add release to VN with id $rev sub edit { - my($self, $rid, $rev) = @_; + my($self, $rid, $rev, $copy) = @_; my $vid = 0; + $copy = $rev && $rev eq 'copy' || $copy && $copy eq 'copy'; + $rev = undef if defined $rev && $rev !~ /^\d+$/; if($rid eq 'v') { $vid = $rev; $rev = undef; @@ -318,23 +320,28 @@ sub edit { { name => 'vn', maxlength => 5000 }, { name => 'editsum', maxlength => 5000 }, ); + + my($media, $producers, $new_vn); if(!$frm->{_err}) { # de-serialize - my $media = [ map [ split / / ], split /,/, $frm->{media} ]; - my $producers = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{producers} ]; - my $new_vn = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{vn} ]; + $media = [ map [ split / / ], split /,/, $frm->{media} ]; + $producers = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{producers} ]; + $new_vn = [ map { /^([0-9]+)/ ? $1 : () } split /\|\|\|/, $frm->{vn} ]; $frm->{platforms} = [ grep $_, @{$frm->{platforms}} ]; $frm->{$_} = $frm->{$_} ? 1 : 0 for (qw|patch freeware doujin|); $frm->{doujin} = 0 if $frm->{patch}; - return $self->resRedirect("/r$rid", 'post') - if $rid && + my $same = $rid && (join(',', sort @{$b4{platforms}}) eq join(',', sort @{$frm->{platforms}})) && (join(',', sort @$producers) eq join(',', sort map $_->{id}, @{$r->{producers}})) && (join(',', sort @$new_vn) eq join(',', sort map $_->{vid}, @$vn)) && (join(',', sort @{$b4{languages}}) eq join(',', sort @{$frm->{languages}})) && !grep !/^(platforms|producers|vn|languages)$/ && $frm->{$_} ne $b4{$_}, keys %b4; + return $self->resRedirect("/r$rid", 'post') if !$copy && $same; + $frm->{_err} = [ 'nochanges' ] if $copy && $same; + } + if(!$frm->{_err}) { my %opts = ( (map { $_ => $frm->{$_} } qw| type title original gtin catalog languages website released notes minage platforms resolution editsum patch voiced freeware doujin ani_story ani_ero|), @@ -344,8 +351,8 @@ sub edit { ); $rev = 1; - ($rev) = $self->dbReleaseEdit($rid, %opts) if $rid; - ($rid) = $self->dbReleaseAdd(%opts) if !$rid; + ($rev) = $self->dbReleaseEdit($rid, %opts) if !$copy && $rid; + ($rid) = $self->dbReleaseAdd(%opts) if $copy || !$rid; $self->multiCmd("ircnotify r$rid.$rev"); $self->vnCacheUpdate(@$new_vn, map $_->{vid}, @$vn); @@ -356,21 +363,22 @@ sub edit { !defined $frm->{$_} && ($frm->{$_} = $b4{$_}) for keys %b4; $frm->{languages} = ['ja'] if !$rid && !defined $frm->{languages}; - $frm->{editsum} = sprintf 'Reverted to revision r%d.%d', $rid, $rev if $rev && !defined $frm->{editsum}; + $frm->{editsum} = sprintf 'Reverted to revision r%d.%d', $rid, $rev if !$copy && $rev && !defined $frm->{editsum}; + $frm->{editsum} = sprintf 'New release based on r%d.%d', $rid, $r->{rev} if $copy && !defined $frm->{editsum}; - $self->htmlHeader(js => 'forms', title => $rid ? 'Edit '.$r->{title} : 'Add release to '.$v->{title}, noindex => 1); - $self->htmlMainTabs('r', $r, 'edit') if $rid; + $self->htmlHeader(js => 'forms', title => $rid ? ''.($copy ? 'Copy ':'Edit ').$r->{title} : 'Add release to '.$v->{title}, noindex => 1); + $self->htmlMainTabs('r', $r, $copy ? 'copy' : 'edit') if $rid; $self->htmlMainTabs('v', $v, 'edit') if $vid; - $self->htmlEditMessage('r', $r); - _form($self, $r, $v, $frm); + $self->htmlEditMessage('r', $r, $copy); + _form($self, $r, $v, $frm, $copy); $self->htmlFooter; } sub _form { - my($self, $r, $v, $frm) = @_; + my($self, $r, $v, $frm, $copy) = @_; - $self->htmlForm({ frm => $frm, action => $r ? "/r$r->{id}/edit" : "/v$v->{id}/add", editsum => 1 }, + $self->htmlForm({ frm => $frm, action => $r ? "/r$r->{id}/".($copy ? 'copy' : 'edit') : "/v$v->{id}/add", editsum => 1 }, "General info" => [ [ select => short => 'type', name => 'Type', options => [ map [ $_, $self->{release_types}[$_] ], 0..$#{$self->{release_types}} ] ], diff --git a/lib/VNDB/Util/CommonHTML.pm b/lib/VNDB/Util/CommonHTML.pm index cbb84dd8..2f0a3274 100644 --- a/lib/VNDB/Util/CommonHTML.pm +++ b/lib/VNDB/Util/CommonHTML.pm @@ -69,6 +69,12 @@ sub htmlMainTabs { end; } + if($type eq 'r' && $self->authCan('edit')) { + li $sel eq 'copy' ? (class => 'tabselected') : (); + a href => "/$id/copy", 'copy'; + end; + } + if($type =~ /[vrp]/ && $self->authCan('del')) { li; a href => "/$id/hide", $obj->{hidden} ? 'unhide' : 'hide'; @@ -358,12 +364,22 @@ sub revdiff { # Generates a generic message to show as the header of the edit forms # Arguments: v/r/p, obj sub htmlEditMessage { - my($self, $type, $obj) = @_; + my($self, $type, $obj, $copy) = @_; my $full = {v => 'visual novel', r => 'release', p => 'producer'}->{$type}; my $guidelines = {v => 2, r => 3, p => 4}->{$type}; div class => 'mainbox'; - h1 $obj ? 'Edit '.($obj->{name}||$obj->{title}) : "Add new $full"; + h1 $obj ? ''.($copy ? 'Copy ':'Edit ').($obj->{name}||$obj->{title}) : "Add new $full"; + if($copy) { + div class => 'warning'; + h2 "You're not editing a release!"; + p; + txt "You're about to insert a new release into the database with information based on "; + a href => "/$type$obj->{id}", $obj->{title}; + txt ". Hit the 'edit' tab on the right-top if you intended to edit the release instead of creating a new one."; + end; + end; + } div class => 'notice'; h2 'Before editing:'; ul; diff --git a/lib/VNDB/Util/FormHTML.pm b/lib/VNDB/Util/FormHTML.pm index e841fa65..b37d6ba8 100644 --- a/lib/VNDB/Util/FormHTML.pm +++ b/lib/VNDB/Util/FormHTML.pm @@ -53,6 +53,7 @@ my %formerr_exeptions = ( noimage => 'Image must be in JPEG or PNG format', toolarge => 'Image is too large, only 500kB allowed', oneaday => 'You can only register one account from the same IP within 24 hours', + nochanges => 'No changes, please don\'t create an entry that is fully -identical- to another', ); -- cgit v1.2.3