package FS::radius_group;
use strict;
-use base qw( FS::Record );
-use FS::Record qw( qsearch qsearchs );
+use base qw( FS::o2m_Common FS::Record );
+use FS::Record qw( qsearch qsearchs dbh );
+use FS::radius_attr;
=head1 NAME
description
+=item priority
+
+priority - for export
+
+=item speed_up, speed_down - connection speeds in bits per second. Some
+exports may use this to generate appropriate RADIUS attributes.
=back
=cut
-# the delete method can be inherited from FS::Record
+sub delete {
+ # okay, I guess we support it now
+ my $self = shift;
+ local $SIG{HUP} = 'IGNORE';
+ local $SIG{INT} = 'IGNORE';
+ local $SIG{QUIT} = 'IGNORE';
+ local $SIG{TERM} = 'IGNORE';
+ local $SIG{TSTP} = 'IGNORE';
+ local $SIG{PIPE} = 'IGNORE';
+
+ my $oldAutoCommit = $FS::UID::AutoCommit;
+ local $FS::UID::AutoCommit = 0;
+ my $dbh = dbh;
+
+ my $groupnum = $self->groupnum;
+ my $error = $self->process_o2m(
+ 'table' => 'radius_usergroup',
+ 'num_col' => 'groupnum',
+ 'fields' => ['groupnum'], # just delete them
+ 'params' => {},
+ ) || $self->SUPER::delete(@_);
+
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+
+ foreach my $part_svc_column (
+ qsearch('part_svc_column', { columnname => 'usergroup' })
+ ) {
+ my $new_values = join(',',
+ grep { $_ != $groupnum } split(',', $part_svc_column->columnvalue)
+ );
+ next if $new_values eq $part_svc_column->columnvalue;
+ $part_svc_column->set(columnvalue => $new_values);
+ $error = $part_svc_column->replace;
+ if ( $error ) {
+ $dbh->rollback if $oldAutoCommit;
+ return $error;
+ }
+ }
+ dbh->commit;
+ '';
+}
=item replace OLD_RECORD
=cut
-# the replace method can be inherited from FS::Record
+# To keep these things from proliferating, we will follow the same
+# export/noexport switches that radius_attr uses. If you _don't_ use
+# Freeside to maintain your RADIUS group attributes, then it probably
+# shouldn't try to rename groups either.
+
+sub replace {
+ my ($self, $old) = @_;
+ $old ||= $self->replace_old;
+
+ my $error = $self->check;
+ return $error if $error;
+
+ if ( !$FS::radius_attr::noexport_hack ) {
+ foreach ( qsearch('part_export', {}) ) {
+ next if !$_->option('export_attrs',1);
+ $error = $_->export_group_replace($self, $old);
+ return $error if $error;
+ }
+ }
+
+ $self->SUPER::replace($old);
+}
=item check
$self->ut_numbern('groupnum')
|| $self->ut_text('groupname')
|| $self->ut_textn('description')
+ || $self->ut_numbern('priority')
+ || $self->ut_numbern('speed_up')
+ || $self->ut_numbern('speed_down')
;
return $error if $error;
: $self->groupname;
}
+=item radius_attr
+
+Returns all L<FS::radius_attr> objects (check and reply attributes) for
+this group.
+
+=cut
+
+sub radius_attr {
+ my $self = shift;
+ qsearch({
+ table => 'radius_attr',
+ hashref => {'groupnum' => $self->groupnum },
+ order_by => 'ORDER BY attrtype, attrname',
+ })
+}
+
=back
=head1 BUGS