diff options
Diffstat (limited to 'lib/VNDB/Producers.pm')
-rw-r--r-- | lib/VNDB/Producers.pm | 188 |
1 files changed, 188 insertions, 0 deletions
diff --git a/lib/VNDB/Producers.pm b/lib/VNDB/Producers.pm new file mode 100644 index 00000000..55a02d3d --- /dev/null +++ b/lib/VNDB/Producers.pm @@ -0,0 +1,188 @@ + +package VNDB::Producers; + +use strict; +use warnings; +use Exporter 'import'; +use Digest::MD5; + +use vars ('$VERSION', '@EXPORT'); +$VERSION = $VNDB::VERSION; +@EXPORT = qw| PPage PBrowse PEdit PDel PLock PHide PXML |; + + +sub PPage { + my $self = shift; + my $id = shift; + + + my $r = $self->FormCheck( + { name => 'rev', required => 0, default => 0, template => 'int' }, + { name => 'diff', required => 0, default => 0, template => 'int' }, + ); + + my $p = $self->DBGetProducer( + id => $id, + $r->{rev} ? ( what => 'changes' ) : (), + $r->{rev} ? ( rev => $r->{rev} ) : () + )->[0]; + return $self->ResNotFound if !$p->{id}; + + $r->{diff} ||= $p->{prev} if $r->{rev}; + my $c = $r->{diff} && $self->DBGetProducer(id => $id, rev => $r->{diff}, what => 'changes')->[0]; + $p->{next} = $self->DBGetHist(type => 'p', id => $id, next => $p->{cid}, showhid => 1)->[0]{id} if $r->{rev}; + + return $self->ResAddTpl(ppage => { + prod => $p, + prev => $c, + change => $r->{diff} || $r->{rev}, + vn => $self->DBGetProducerVN($id), + }); +} + + +sub PBrowse { + my $self = shift; + my $chr = shift; + $chr = 'all' if !defined $chr; + + my $p = $self->FormCheck( + { name => 'p', required => 0, default => 1, template => 'int' }, + { name => 'q', required => 0, default => '' } + ); + + my($r, $np) = $self->DBGetProducer( + $chr ne 'all' ? ( + char => $chr ) : (), + $p->{q} ? ( + search => $p->{q} ) : (), + page => $p->{p}, + results => 50, + ); + + $self->ResAddTpl(pbrowse => { + prods => $r, + page => $p->{p}, + npage => $np, + query => $p->{q}, + chr => $chr, + }); +} + + +sub PEdit { + my $self = shift; + my $id = shift || 0; # 0 = new + + my $rev = $self->FormCheck({ name => 'rev', required => 0, default => 0, template => 'int' })->{rev}; + + my $p = $self->DBGetProducer(id => $id, what => 'changes', $rev ? ( rev => $rev ) : ())->[0] if $id; + return $self->ResNotFound() if $id && !$p; + + return $self->ResDenied if !$self->AuthCan('edit') || ($p->{locked} && !$self->AuthCan('lock')); + + + my %b4 = $id ? ( + map { $_ => $p->{$_} } qw|name original website type lang desc| + ) : (); + + my $frm = {}; + if($self->ReqMethod() eq 'POST') { + $frm = $self->FormCheck( + { name => 'type', required => 1, enum => [ keys %$VNDB::PROT ] }, + { name => 'name', required => 1, maxlength => 200 }, + { name => 'original', required => 0, maxlength => 200, default => '' }, + { name => 'lang', required => 1, enum => [ keys %$VNDB::LANG ] }, + { name => 'website', required => 0, maxlength => 200, template => 'url', default => '' }, + { name => 'desc', required => 0, maxlength => 10240, default => '' }, + { name => 'comm', required => 0, default => '' }, + ); + + return $self->ResRedirect('/p'.$id, 'post') + if $id && 6 == scalar grep { $_ ne 'comm' && $b4{$_} eq $frm->{$_} } keys %b4; + + if(!$frm->{_err}) { + my $cid; + $cid = $self->DBEditProducer($id, %$frm) if $id; # edit + ($id, $cid) = $self->DBAddProducer(%$frm) if !$id; # add + return $self->ResRedirect('/p'.$id.'?rev='.$cid, 'post'); + } + } + + if($id) { + $frm->{$_} ||= $b4{$_} for (keys %b4); + $frm->{comm} = sprintf 'Reverted to revision %d by %s.', $p->{cid}, $p->{username} if $p->{cid} != $p->{latest}; + } else { + $frm->{lang} ||= 'ja'; + } + + $self->ResAddTpl(pedit => { + form => $frm, + id => $id, + prod => $p, + }); +} + + +sub PDel { + my $self = shift; + my $id = shift; + + my $p = $self->DBGetProducer(id => $id)->[0]; + return $self->ResNotFound if !$p; + return $self->ResDenied if !$self->AuthCan('del'); + $self->DBDelProducer($id); + return $self->ResRedirect('/p', 'perm'); +} + + +sub PLock { + my $self = shift; + my $id = shift; + + my $p = $self->DBGetProducer(id => $id)->[0]; + return $self->ResNotFound() if !$p; + return $self->ResDenied if !$self->AuthCan('lock'); + $self->DBLockItem('producers', $id, $p->{locked}?0:1); + return $self->ResRedirect('/p'.$id, 'perm'); +} + + +sub PHide { + my $self = shift; + my $id = shift; + + my $p = $self->DBGetProducer(id => $id)->[0]; + return $self->ResNotFound() if !$p; + return $self->ResDenied if !$self->AuthCan('del'); + $self->DBHideProducer($id, $p->{hidden}?0:1); + return $self->ResRedirect('/p'.$id, 'perm'); +} + +sub PXML { + my $self = shift; + + my $q = $self->FormCheck( + { name => 'q', required => 0, maxlength => 100 } + )->{q}; + + my $r = []; + if($q) { + $r = $self->DBGetProducer(results => 10, + $q =~ /^p([0-9]+)$/ ? (id => $1) : (search => $q)); + } + + my $x = $self->ResStartXML; + $x->startTag('producers', results => $#$r+1, query => $q); + for (@$r) { + $x->startTag('item'); + $x->dataElement(id => $_->{id}); + $x->dataElement(name => $_->{name}); + $x->dataElement(original => $_->{original}) if $_->{original}; + $x->dataElement(website => $_->{website}) if $_->{website}; + $x->endTag('item'); + } + $x->endTag('producers'); +} + + |