1 package CXGN
::People
::Group
;
4 =head1 CXGN::People::Group
6 A module for dealing with groups of people on SGN. Mostly abstracts
7 sgn_people.sp_group table, but also does handling with sp_group_member
8 in matters regarding group membership.
13 You can use this framework to access an existing group and its membership
14 or create an entirely new one:
16 my $group = CXGN::People::Group->new("BioFools");
17 my @members = $group->members();
18 foreach(@members){ #CXGN::People::Group::Member objects
21 $_->set_password("blank");
25 my $group = CXGN::People::Group->new();
26 $group->add_member(425);
27 $group->add_member(333);
28 $group->add_member($member);
29 $group->name("BioFools");
30 $group->description("Paving the way to a greener future");
35 use base qw
/CXGN::Class::DBI/;
36 use Class
::MethodMaker
53 __PACKAGE__
->required_search_paths(qw
/sgn_people/);
77 SET name=?, description=?
83 DELETE FROM sp_group_member
92 INSERT INTO sp_group_member
93 (sp_person_id, sp_group_id)
99 while(my($k,$v) = each %q){
100 __PACKAGE__
->set_sql($k,$v);
107 my ($dbh, $name) = @_;
108 my $self = bless {}, $class;
110 my $id_q = $self->get_sql('fetch');
111 $id_q->execute($name);
112 my $row = $id_q->fetchrow_hashref;
113 $self->sp_group_id($row->{sp_group_id
});
121 return unless _have_id
($self);
122 return unless _have_dbh
($self);
124 my $dbh = $self->dbh;
125 my $gq = $dbh->prepare("SELECT name, description FROM sp_group WHERE sp_group_id=?");
126 my $mq = $dbh->prepare("SELECT sp_person_id, status FROM sp_group_member WHERE sp_group_id=?");
129 my $group_row = $gq->fetchrow_hashref;
130 $self->name($group_row->{name
});
131 $self->description($group_row->{description
});
134 while(my $row = $mq->fetchrow_hashref){
135 my $member = CXGN
::People
::Group
::Member
->new({
137 sp_person_id
=> $row->{sp_person_id
},
138 sp_group_id
=> $self->sp_group_id,
139 status
=> $row->{status
}
141 $self->add_member($member);
148 return unless _have_dbh
($self);
149 my $dbh = (ref $self)->DBH();
150 my $make_group_q = $self->get_sql("create_group");
151 my $update_group_q = $self->get_sql("update_group");
153 #See if we are making a new group:
154 unless(_have_id
($self)){
155 $make_group_q->execute($self->name, $self->description);
156 $self->sp_group_id($dbh->last_insert_id("sgn_people.sp_group"));
159 $update_group_q->execute($self->name, $self->description);
163 my $add_q = $self->get_sql('add_group_member');
164 my $remove_q = $self->get_sql('remove_group');
165 foreach($self->added_members){
166 $add_q->execute($_->sp_person_id, $self->sp_group_id);
168 foreach($self->removed_members){
169 $remove_q->execute($_->sp_person_id, $self->sp_group_id);
175 my $member_arg = shift;
178 foreach my $m ($self->members){
179 if(ref($member_arg) eq "HASH" && $m==$member_arg){
182 elsif($m->sp_person_id == $member_arg){
189 unless($member_target){
190 print STDERR
"Member $member_arg not found";
193 my @removed = $self->removed_members;
194 push(@removed, $member_target);
195 $self->removed_members(@removed);
196 $self->members(@current);
199 sub get_member_by_id
{
202 foreach my $member ($self->members){
203 return $member if ($id == $member->sp_person_id);
209 my $member_arg = shift;
210 if(ref($member_arg) eq "HASH"){
211 my @current = $self->members;
212 push(@current, $member_arg);
213 $self->members(@current);
214 my @added = $self->added_members;
215 push(@added, $member_arg);
216 $self->added_members(@added);
218 else { #you can add member by sp_person_id, also
219 my $member = CXGN
::People
::Group
::Member
->new({
221 sp_person_id
=> $member_arg,
222 sp_group_id
=> $self->sp_group_id,
224 $self->add_member($member) if $member->is_sp_person;
231 unless($self->{sp_group_id
}){
232 print STDERR
"Attempted operation on group with no sp_group_id\n";
240 unless($self->{dbh
}){
241 print STDERR
"Attempted operation on group with no database handle!\n";