Merge pull request #42 from solgenomics/topic/duplicate_image_warning
[cxgn-corelibs.git] / lib / CXGN / People / Group.pm
blob6a3030497b2a33d02859ba760ff5b70521386680
1 package CXGN::People::Group;
2 use strict;
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.
11 =head1 Usage
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
19 $_->sp_person_id;
20 $_->get_private_email
21 $_->set_password("blank");
24 #New group creation
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");
31 $group->store();
33 =cut
35 use base qw/CXGN::Class::DBI/;
36 use Class::MethodMaker
37 [ scalar =>
38 [qw/
39 sp_group_id
40 name
41 description
42 dbh
43 /],
44 array =>
45 [qw/
46 members
47 removed_members
48 added_members
50 ];
52 BEGIN {
53 __PACKAGE__->required_search_paths(qw/sgn_people/);
54 our %q = (
56 fetch =>
59 SELECT sp_group_id
60 FROM sp_group
61 WHERE name=?
64 create_group =>
67 INSERT INTO sp_group
68 (name, description)
69 VALUES
70 (?, ?)
73 update_group =>
76 UPDATE sp_group
77 SET name=?, description=?
80 remove_group =>
83 DELETE FROM sp_group_member
84 WHERE
85 sp_person_id=?
86 AND sp_group_id=?
89 add_group_member =>
92 INSERT INTO sp_group_member
93 (sp_person_id, sp_group_id)
94 VALUES
95 (?, ?)
99 while(my($k,$v) = each %q){
100 __PACKAGE__->set_sql($k,$v);
105 sub new {
106 my $class = shift;
107 my ($dbh, $name) = @_;
108 my $self = bless {}, $class;
109 if($name){
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});
114 $self->fetch();
116 return $self;
119 sub fetch {
120 my $self = shift;
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=?");
128 $gq->execute();
129 my $group_row = $gq->fetchrow_hashref;
130 $self->name($group_row->{name});
131 $self->description($group_row->{description});
133 $mq->execute();
134 while(my $row = $mq->fetchrow_hashref){
135 my $member = CXGN::People::Group::Member->new({
136 dbh => $self->dbh,
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);
146 sub store {
147 my $self = shift;
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"));
158 else {
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);
173 sub remove_member {
174 my $self = shift;
175 my $member_arg = shift;
176 my $member_target;
177 my @current = ();
178 foreach my $m ($self->members){
179 if(ref($member_arg) eq "HASH" && $m==$member_arg){
180 $member_target = $m;
182 elsif($m->sp_person_id == $member_arg){
183 $member_target = $m;
185 else{
186 push(@current, $m);
189 unless($member_target){
190 print STDERR "Member $member_arg not found";
191 return;
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 {
200 my $self = shift;
201 my $id = shift;
202 foreach my $member ($self->members){
203 return $member if ($id == $member->sp_person_id);
207 sub add_member {
208 my $self = shift;
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({
220 dbh => $self->dbh,
221 sp_person_id => $member_arg,
222 sp_group_id => $self->sp_group_id,
224 $self->add_member($member) if $member->is_sp_person;
229 sub _have_id {
230 my $self = shift;
231 unless($self->{sp_group_id}){
232 print STDERR "Attempted operation on group with no sp_group_id\n";
233 return 0;
235 return 1;
238 sub _have_dbh {
239 my $self = shift;
240 unless($self->{dbh}){
241 print STDERR "Attempted operation on group with no database handle!\n";
242 return 0;
244 return 1;
248 ####
249 1;##
250 ####