From 63b87a12dc6cef88784b2d061a6471a370a350f0 Mon Sep 17 00:00:00 2001 From: "Leigh B. Stoller" <stoller@flux.utah.edu> Date: Fri, 5 Jan 2007 21:21:53 +0000 Subject: [PATCH] Add a few more routines, to be used from mkproj. --- db/Group.pm.in | 21 ++++++++++++++++-- db/Project.pm.in | 55 +++++++++++++++++++++++++++++++++++++++++++++++- db/User.pm.in | 26 ++++++++++++++++++++++- 3 files changed, 98 insertions(+), 4 deletions(-) diff --git a/db/Group.pm.in b/db/Group.pm.in index 04694ad327..d5ee612f0a 100644 --- a/db/Group.pm.in +++ b/db/Group.pm.in @@ -1,7 +1,7 @@ #!/usr/bin/perl -wT # # EMULAB-COPYRIGHT -# Copyright (c) 2005, 2006 University of Utah and the Flux Group. +# Copyright (c) 2005, 2006, 2007 University of Utah and the Flux Group. # All rights reserved. # package Group; @@ -53,7 +53,7 @@ sub Lookup($$) if (exists($groups{"$gid_idx"})); my $query_result = - DBQueryWarn("select * from groups where gid_idx=$gid_idx"); + DBQueryWarn("select * from groups where gid_idx='$gid_idx'"); return undef if (!$query_result || !$query_result->numrows); @@ -165,6 +165,23 @@ sub Update($$) return Refresh($self); } +# +# Change the leader for a group. +# +sub ChangeLeader($$) +{ + my ($self, $leader) = @_; + + # Must be a real reference. + return -1 + if (! (ref($self) && ref($leader))); + + my %args = (); + $args{'leader'} = $leader->uid(); + $args{'leader_idx'} = $leader->uid_idx(); + return $self->Update(\%args); +} + # # Add a user to the group # diff --git a/db/Project.pm.in b/db/Project.pm.in index 7312e9893a..8974941836 100644 --- a/db/Project.pm.in +++ b/db/Project.pm.in @@ -17,6 +17,7 @@ use vars qw(@ISA @EXPORT); use lib '@prefix@/lib'; use libdb; use libtestbed; +use User; use Group; use English; use Data::Dumper; @@ -99,6 +100,7 @@ sub created($) { return field($_[0], "created"); } sub description($) { return field($_[0], "description"); } sub expt_count($) { return field($_[0], "expt_count"); } sub expt_last($) { return field($_[0], "expt_last"); } +sub approved($) { return field($_[0], "approved"); } sub wikiname($) { return field($_[0], "wikiname"); } sub mailman_password($) { return field($_[0], "mailman_password"); } @@ -144,7 +146,7 @@ sub Refresh($) $self->{'PROJECT'} = $query_result->fetchrow_hashref(); - return 0; + return $self->{'GROUP'}->Refresh(); } # @@ -184,6 +186,57 @@ sub Update($$) return Refresh($self); } +# +# Return user object for leader. +# +sub GetLeader($) +{ + my ($self) = @_; + + # Must be a real reference. + return -1 + if (! ref($self)); + + return User->Lookup($self->head_idx()); +} + +# +# Change the leader for a project. Done *only* before project is approved. +# +sub ChangeLeader($$) +{ + my ($self, $leader) = @_; + + # Must be a real reference. + return -1 + if (! (ref($self) && ref($leader))); + + # Default group fits. + $self->{'GROUP'}->ChangeLeader($leader) == 0 + or return -1; + + # Then the project + my %args = (); + $args{'head_uid'} = $leader->uid(); + $args{'head_idx'} = $leader->uid_idx(); + return $self->Update(\%args); +} + +# +# Set the approval bit, +# +sub SetApproved($$) +{ + my ($self, $approved) = @_; + + # Must be a real reference. + return -1 + if (! (ref($self))); + + my %args = ("approved" => ($approved ? 1 : 0)); + return $self->Update(\%args); +} + # # Delete a user from the project (and all subgroups of course). No checks # are made; that should be done higher up. Optionally return list of groups diff --git a/db/User.pm.in b/db/User.pm.in index c87011c27b..9b5d24632b 100644 --- a/db/User.pm.in +++ b/db/User.pm.in @@ -171,6 +171,14 @@ sub LookupByUnixId($$) return User->Lookup($uid_idx); } +# +# Wrap above function so I do not forget to use it for the current user. +# +sub ThisUser($) +{ + return User->LookupByUnixId($UID); +} + # # Refresh a class instance by reloading from the DB. # @@ -265,7 +273,7 @@ sub FirstApprovedProject($$) "order by date_approved asc limit 1"); if (! $query_result || !$query_result->numrows) { - $pptr = undef; + $$pptr = undef; return 0; } @@ -281,6 +289,22 @@ sub FirstApprovedProject($$) return 0; } +# +# Change the status of a user in the DB. +# +sub SetStatus($$) +{ + my ($self, $status) = @_; + + # Must be a real reference. + return -1 + if (! ref($self)); + + my %args = ("status" => $status); + + return $self->Update(\%args); +} + # # Set password for user. # -- GitLab