3a5ce358d01513a91aa0c0017f5fb69eeb894350
[freeside.git] / FS / FS / svc_Radius_Mixin.pm
1 package FS::svc_Radius_Mixin;
2
3 use strict;
4 use base qw(FS::m2m_Common FS::svc_Common);
5 use FS::Record qw(qsearch);
6 use FS::radius_group;
7 use FS::radius_usergroup;
8 use Carp qw(confess);
9
10 =head1 NAME
11
12 FS::svc_Radius_Mixin - partial base class for services with RADIUS groups
13
14 =cut
15
16
17 sub insert {
18   my $self = shift;
19   $self->SUPER::insert(@_)
20   || $self->process_m2m(
21     'link_table' => 'radius_usergroup',
22     'target_table' => 'radius_group',
23     'params' => $self->usergroup,
24   );
25 }
26
27 sub replace  {
28   my $new = shift;
29   my $old = shift;
30   $old = $new->replace_old if !defined($old);
31
32   $old->usergroup; # make sure this is cached for exports
33   $new->process_m2m(
34     'link_table' => 'radius_usergroup',
35     'target_table' => 'radius_group',
36     'params' => $new->usergroup,
37   ) || $new->SUPER::replace($old, @_);
38 }
39
40 sub delete {
41   my $self = shift;
42   $self->SUPER::delete(@_)
43   || $self->process_m2m(
44     'link_table' => 'radius_usergroup',
45     'target_table' => 'radius_group',
46     'params' => [],
47   );
48 }
49
50 sub usergroup {
51   my $self = shift;
52   my $value = shift;
53   if ( defined $value ) {
54     if ( ref $value ) {
55       return $self->set('usergroup', $value);
56     }
57     else {
58       return $self->set('usergroup', [ split(/\s*,\s*/, $value) ]);
59     }
60   }
61   $self->get('usergroup') || 
62     # if no argument is passed and usergroup is not set already, 
63     # fetch this service's group assignments
64   $self->set('usergroup', 
65     [ map { $_->groupnum } 
66         qsearch('radius_usergroup', { svcnum => $self->svcnum }) ]
67   );
68 }
69
70 sub _fieldhandlers {
71   { 
72     'usergroup' => \&usergroup
73   }
74 }
75
76 =item radius_groups METHOD
77
78 Returns a list of RADIUS groups for this service (see L<FS::radius_usergroup>).
79 METHOD is the field to return, and can be any method on L<FS::radius_group>.
80 Useful values for METHOD include 'groupnum', 'groupname', and 
81 'long_description'.  Defaults to 'groupname' for historical reasons.
82
83 =cut
84
85 sub radius_groups {
86   my $self = shift;
87   my $method = shift || 'groupname';
88   my $groups = join(',', @{$self->usergroup}) || return ();
89   my @groups = qsearch({'table' => 'radius_group',
90                         'extra_sql' => "where groupnum in ($groups)"});
91   return map {$_->$method} @groups;
92 }
93
94 1;