summaryrefslogtreecommitdiff
path: root/lib/VNDB/Producers.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/VNDB/Producers.pm')
-rw-r--r--lib/VNDB/Producers.pm188
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');
+}
+
+