add progressbar to service definition add - duplicate checking can take a while,...
[freeside.git] / FS / FS / UI / Web.pm
1 package FS::UI::Web;
2
3 #use vars qw(@ISA);
4 #use FS::UI
5 #@ISA = qw( FS::UI );
6
7
8 # begin JSRPC code...
9
10 package FS::UI::Web::JSRPC;
11
12 use strict;
13 use vars qw(@ISA $DEBUG);
14 use Storable qw(nfreeze);
15 use MIME::Base64;
16 use JavaScript::RPC::Server::CGI;
17 use FS::UID;
18 use FS::Record qw(qsearchs);
19 use FS::queue;
20
21 @ISA = qw( JavaScript::RPC::Server::CGI );
22 $DEBUG = 0;
23
24 sub new {
25         my $class = shift;
26         my $self  = {
27                 env => {},
28                 job => shift,
29         };
30
31         bless $self, $class;
32
33         return $self;
34 }
35
36 sub start_job {
37   my $self = shift;
38
39   warn "FS::UI::Web::start_job: ". join(', ', @_) if $DEBUG;
40 #  my %param = @_;
41   my %param = ();
42   while ( @_ ) {
43     my( $field, $value ) = splice(@_, 0, 2);
44     unless ( exists( $param{$field} ) ) {
45       $param{$field} = $value;
46     } elsif ( ! ref($param{$field}) ) {
47       $param{$field} = [ $param{$field}, $value ];
48     } else {
49       push @{$param{$field}}, $value;
50     }
51   }
52   warn "FS::UI::Web::start_job\n".
53        join('', map {
54                       if ( ref($param{$_}) ) {
55                         "  $_ => [ ". join(', ', @{$param{$_}}). " ]\n";
56                       } else {
57                         "  $_ => $param{$_}\n";
58                       }
59                     } keys %param )
60     if $DEBUG;
61
62   #first get the CGI params shipped off to a job ASAP so an id can be returned
63   #to the caller
64   
65   my $job = new FS::queue { 'job' => $self->{'job'} };
66   
67   #too slow to insert all the cgi params as individual args..,?
68   #my $error = $queue->insert('_JOB', $cgi->Vars);
69   
70   #warn 'froze string of size '. length(nfreeze(\%param)). " for job args\n"
71   #  if $DEBUG;
72
73   my $error = $job->insert( '_JOB', encode_base64(nfreeze(\%param)) );
74
75   if ( $error ) {
76     $error;
77   } else {
78     $job->jobnum;
79   }
80   
81 }
82
83 sub job_status {
84   my( $self, $jobnum ) = @_; #$url ???
85
86   sleep 5; #could use something better...
87
88   my $job;
89   if ( $jobnum =~ /^(\d+)$/ ) {
90     $job = qsearchs('queue', { 'jobnum' => $jobnum } );
91   } else {
92     die "FS::UI::Web::job_status: illegal jobnum $jobnum\n";
93   }
94
95   my @return;
96   if ( $job && $job->status ne 'failed' ) {
97     @return = ( 'progress', $job->statustext );
98   } elsif ( !$job ) { #handle job gone case : job sucessful
99                       # so close popup, redirect parent window...
100     @return = ( 'complete' );
101   } else {
102     @return = ( 'error', $job ? $job->statustext : $jobnum );
103   }
104
105   join("\n",@return);
106
107 }
108
109 sub get_new_query {
110   FS::UID::cgi();
111 }
112
113 1;
114