summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--FS/FS/Record.pm2
-rw-r--r--FS/FS/part_export.pm43
-rw-r--r--FS/MANIFEST2
-rw-r--r--FS/t/part_export.t5
-rw-r--r--FS/t/part_export_option.t5
-rwxr-xr-xhttemplate/browse/part_svc.cgi21
-rw-r--r--httemplate/edit/part_export.cgi2
-rw-r--r--httemplate/edit/process/part_export.cgi16
-rwxr-xr-xhttemplate/misc/delete-part_export.cgi15
9 files changed, 82 insertions, 29 deletions
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index 0bd7aeda4..ff967817a 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -947,7 +947,7 @@ Check/untaint host and domain names.
sub ut_domain {
my( $self, $field ) = @_;
#$self->getfield($field) =~/^(\w+\.)*\w+$/
- $self->getfield($field) =~/^(\w+\.)*\w+$/
+ $self->getfield($field) =~/^([\w\-]+\.)*\w+$/
or return "Illegal (domain) $field: ". $self->getfield($field);
$self->setfield($field,$1);
'';
diff --git a/FS/FS/part_export.pm b/FS/FS/part_export.pm
index 59024f651..3f184be07 100644
--- a/FS/FS/part_export.pm
+++ b/FS/FS/part_export.pm
@@ -102,6 +102,7 @@ created (see L<FS::part_export_option>).
#false laziness w/queue.pm
sub insert {
my $self = shift;
+ my $options = shift;
local $SIG{HUP} = 'IGNORE';
local $SIG{INT} = 'IGNORE';
local $SIG{QUIT} = 'IGNORE';
@@ -119,7 +120,6 @@ sub insert {
return $error;
}
- my $options = shift;
foreach my $optionname ( keys %{$options} ) {
my $part_export_option = new FS::part_export_option ( {
'exportnum' => $self->exportnum,
@@ -191,6 +191,8 @@ created or modified (see L<FS::part_export_option>).
sub replace {
my $self = shift;
+ my $old = shift;
+ my $options = shift;
local $SIG{HUP} = 'IGNORE';
local $SIG{INT} = 'IGNORE';
local $SIG{QUIT} = 'IGNORE';
@@ -202,13 +204,12 @@ sub replace {
local $FS::UID::AutoCommit = 0;
my $dbh = dbh;
- my $error = $self->SUPER::replace;
+ my $error = $self->SUPER::replace($old);
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
return $error;
}
- my $options = shift;
foreach my $optionname ( keys %{$options} ) {
my $old = qsearchs( 'part_export_option', {
'exportnum' => $self->exportnum,
@@ -219,6 +220,7 @@ sub replace {
'optionname' => $optionname,
'optionvalue' => $options->{$optionname},
} );
+ $new->optionnum($old->optionnum) if $old;
my $error = $old ? $new->replace($old) : $new->insert;
if ( $error ) {
$dbh->rollback if $oldAutoCommit;
@@ -226,14 +228,16 @@ sub replace {
}
}
- #remove extraneous old options? not necessary now, but...
- #foreach my $opt ( grep { !exist $options->{$_->optionname} } $old->part_export_option ) {
- # my $error = $opt->delete;
- # if ( $error ) {
- # $dbh->rollback if $oldAutoCommit;
- # return $error;
- # }
- #}
+ #remove extraneous old options
+ foreach my $opt (
+ grep { !exists $options->{$_->optionname} } $old->part_export_option
+ ) {
+ my $error = $opt->delete;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
$dbh->commit or die $dbh->errstr if $oldAutoCommit;
@@ -253,6 +257,7 @@ sub check {
my $self = shift;
my $error =
$self->ut_numbern('exportnum')
+ || $self->ut_domain('machine')
|| $self->ut_number('svcpart')
|| $self->ut_alpha('exporttype')
;
@@ -286,6 +291,9 @@ sub part_svc {
=item part_export_option
+Returns all options as FS::part_export_option objects (see
+L<FS::part_export_option>).
+
=cut
sub part_export_option {
@@ -295,6 +303,8 @@ sub part_export_option {
=item options
+Returns a list of option names and values suitable for assigning to a hash.
+
=cut
sub options {
@@ -302,7 +312,9 @@ sub options {
map { $_->optionname => $_->optionvalue } $self->part_export_option;
}
-=item option
+=item option OPTIONNAME
+
+Returns the option value for the given name, or the empty string.
=cut
@@ -318,6 +330,11 @@ sub option {
=item rebless
+Reblesses the object into the FS::part_export::EXPORTTYPE class, where
+EXPORTTYPE is the object's I<exporttype> field. There should be better docs
+on how to create new exports (and they should live in their own files and be
+autoloaded-on-demand), but until then, see L</NEW EXPORT CLASSES>.
+
=cut
sub rebless {
@@ -346,7 +363,7 @@ sub export_insert {
# $self->$method(@_);
#}
-=item export_replace
+=item export_replace NEW OLD
=cut
diff --git a/FS/MANIFEST b/FS/MANIFEST
index c1aa5ef1a..19915cdc9 100644
--- a/FS/MANIFEST
+++ b/FS/MANIFEST
@@ -90,6 +90,8 @@ t/cust_svc.t
t/domain_record.t
t/nas.t
t/part_bill_event.t
+t/part_export.t
+t/part_export_option.t
t/part_pkg.t
t/part_pop_local.t
t/part_referral.t
diff --git a/FS/t/part_export.t b/FS/t/part_export.t
new file mode 100644
index 000000000..26b398791
--- /dev/null
+++ b/FS/t/part_export.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::part_export;
+$loaded=1;
+print "ok 1\n";
diff --git a/FS/t/part_export_option.t b/FS/t/part_export_option.t
new file mode 100644
index 000000000..13200c213
--- /dev/null
+++ b/FS/t/part_export_option.t
@@ -0,0 +1,5 @@
+BEGIN { $| = 1; print "1..1\n" }
+END {print "not ok 1\n" unless $loaded;}
+use FS::part_export_option;
+$loaded=1;
+print "ok 1\n";
diff --git a/httemplate/browse/part_svc.cgi b/httemplate/browse/part_svc.cgi
index cf0f0408c..c66b8ac63 100755
--- a/httemplate/browse/part_svc.cgi
+++ b/httemplate/browse/part_svc.cgi
@@ -14,6 +14,13 @@ my $total = scalar(@part_svc);
%>
<%= header('Service Definition Listing', menubar( 'Main Menu' => $p) ) %>
+<SCRIPT>
+function part_export_areyousure(href) {
+ if (confirm("Are you sure you want to delete this export?") == true)
+ window.location.href = href;
+}
+</SCRIPT>
+
Services are items you offer to your customers.<BR><BR>
<%= $total %> services
<%= $cgi->param('showdisabled')
@@ -61,10 +68,17 @@ my $total = scalar(@part_svc);
foreach my $part_export ( @part_export ) {
%>
<TR>
- <TD><%= $part_export->exporttype %> to <%= $part_export->machine %></TD>
- <TD>(options)</TD>
+ <TD><%= $part_export->exporttype %> to <%= $part_export->machine %> (<A HREF="<%= $p %>edit/part_export.cgi?<%= $part_export->exportnum %>">edit</A>&nbsp;|&nbsp;<A HREF="javascript:part_export_areyousure('<%= $p %>misc/delete-part_export.cgi?<%= $part_export->exportnum %>')">delete</A>)</TD>
+ <TD>
+ <%= itable() %>
+ <% my %opt = $part_export->options;
+ foreach my $opt ( keys %opt ) { %>
+ <TR><TD><%= $opt %></TD><TD><%= $opt{$opt} %></TD></TR>
+ <% } %>
+ </TABLE>
+ </TD>
<% } %>
- </TR><TR><TD COLSPAN=2><A HREF="<%= $p %>edit/part_export.cgi?new_with_svcpart=<%= $part_svc->svcpart %>"><I>Add a new export</I><A></TD></TR>
+ </TR><TR><TD COLSPAN=2><A HREF="<%= $p %>edit/part_export.cgi?new_with_svcpart=<%= $part_svc->svcpart %>"><I>Add a new export</I></A></TD></TR>
<% if (@part_export) { %>
<TR><TD COLSPAN=2>
<FORM METHOD="POST" ACTION="<%= $p %>edit/part_export.cgi">
@@ -75,6 +89,7 @@ my $total = scalar(@part_svc);
<%= $part_export->exporttype %> to <%= $part_export->machine %>
</OPTION>
<% } %>
+ </SELECT>
<INPUT TYPE="submit" VALUE="clone existing export">
</FORM></TD></TR>
<% } %>
diff --git a/httemplate/edit/part_export.cgi b/httemplate/edit/part_export.cgi
index 7ba6fa12b..3d867f50a 100644
--- a/httemplate/edit/part_export.cgi
+++ b/httemplate/edit/part_export.cgi
@@ -27,7 +27,7 @@ if ( $cgi->param('clone') && $cgi->param('clone') =~ /^(\d+)$/ ) {
$action = 'Add';
my $old_part_export = qsearchs('part_export', { 'exportnum' => $1 } );
unless ( $part_export ) {
- ($part_export, $options) = $old_part_export->clone;
+ ($part_export, $options) = $old_part_export->clone($cgi->param('svcpart'));
}
} elsif ( $cgi->param('new_with_svcpart')
&& $cgi->param('new_with_svcpart') =~ /^(\d+)$/ ) {
diff --git a/httemplate/edit/process/part_export.cgi b/httemplate/edit/process/part_export.cgi
index b4ce0b352..d0c87a02a 100644
--- a/httemplate/edit/process/part_export.cgi
+++ b/httemplate/edit/process/part_export.cgi
@@ -5,7 +5,8 @@ my $exportnum = $cgi->param('exportnum');
my $old = qsearchs('part_export', { 'exportnum'=>$exportnum } ) if $exportnum;
#fixup options
-my %options = map { $_=>$cgi->param($_) } $cgi->param('options');
+warn join('-', split(',',$cgi->param('options')));
+my %options = map { $_=>$cgi->param($_) } split(',',$cgi->param('options'));
my $new = new FS::part_export ( {
map {
@@ -13,20 +14,13 @@ my $new = new FS::part_export ( {
} fields('part_export')
} );
-local $SIG{HUP} = 'IGNORE';
-local $SIG{INT} = 'IGNORE';
-local $SIG{QUIT} = 'IGNORE';
-local $SIG{TERM} = 'IGNORE';
-local $SIG{TSTP} = 'IGNORE';
-local $SIG{PIPE} = 'IGNORE';
-
-local $FS::UID::AutoCommit = 0;
-
my $error;
if ( $exportnum ) {
+ warn $old;
+ warn $exportnum;
$error = $new->replace($old,\%options);
} else {
- $error = $new->insert,\%options);
+ $error = $new->insert(\%options);
# $exportnum = $new->exportnum;
}
diff --git a/httemplate/misc/delete-part_export.cgi b/httemplate/misc/delete-part_export.cgi
new file mode 100755
index 000000000..a5166d944
--- /dev/null
+++ b/httemplate/misc/delete-part_export.cgi
@@ -0,0 +1,15 @@
+<%
+
+#untaint paynum
+my($query) = $cgi->keywords;
+$query =~ /^(\d+)$/ || die "Illegal exportnum";
+my $exportnum = $1;
+
+my $part_export = qsearchs('part_export',{'exportnum'=>$exportnum});
+
+my $error = $part_export->delete;
+eidiot($error) if $error;
+
+print $cgi->redirect($p. "browse/part_svc.cgi");
+
+%>