[Rt-commit] rt branch, admin_ui, updated. 67abf7f7e8f93a9cc3abdd8aae591e801de62a45

sunnavy at bestpractical.com sunnavy at bestpractical.com
Mon Nov 30 22:26:36 EST 2009


The branch, admin_ui has been updated
       via  67abf7f7e8f93a9cc3abdd8aae591e801de62a45 (commit)
      from  b34b2187f86b08d57122f19592563f817c66127c (commit)

Summary of changes:
 lib/RT/Action/EditUserRights.pm |   87 ++++++++++++++++++++++++++++++++++-----
 1 files changed, 76 insertions(+), 11 deletions(-)

- Log -----------------------------------------------------------------
commit 67abf7f7e8f93a9cc3abdd8aae591e801de62a45
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Dec 1 11:26:25 2009 +0800

    complete action EditUserRights

diff --git a/lib/RT/Action/EditUserRights.pm b/lib/RT/Action/EditUserRights.pm
index c57c86f..51c62c5 100644
--- a/lib/RT/Action/EditUserRights.pm
+++ b/lib/RT/Action/EditUserRights.pm
@@ -8,9 +8,16 @@ use Scalar::Defer;
 
 sub arguments {
     my $self = shift;
-
-    #    return $self->{__cached_arguments} if ( $self->{__cached_arguments} );
+    return {} unless $self->object;
     my $args = {};
+    $args->{object_id} = {
+        render_as     => 'hidden',
+        default_value => $self->object->id,
+    };
+    $args->{object_type} = {
+        render_as     => 'hidden',
+        default_value => ref $self->object,
+    };
 
     my $privileged =
       RT::Model::Group->new( current_user => Jifty->web->current_user );
@@ -22,19 +29,17 @@ sub arguments {
           RT::Model::Group->new( current_user => Jifty->web->current_user );
         $group->load_acl_equivalence( $user->member );
 
-        my $name = join '-',
-          $group->principal_id, ref( $self->object ), $self->object->id;
+        my $name = 'rights_' . $group->principal_id;
         $args->{$name} = {
-            default_value    => defer { $self->default_value($group) },
+            default_value    => defer {
+                $self->default_value($group->principal_id) },
             available_values => defer { $self->available_values },
-            render_as        => 'Select',
+            render_as        => 'Checkboxes',
             multiple         => 1,
             label => $user->member->object->real_name,
         };
     }
     return $args;
-
-    #    return $self->{__cached_arguments} = $args;
 }
 
 =head2 take_action
@@ -44,10 +49,70 @@ sub arguments {
 sub take_action {
     my $self = shift;
 
-    for my $arg ( $self->argument_names ) {
+    my $object_type = $self->argument_value('object_type');
+    return unless $object_type;
+    if ( $object_type eq 'RT::System' ) {
+        $self->object( RT->system );
+    }
+    elsif ( $RT::Model::ACE::OBJECT_TYPES{$object_type} ) {
+        my $object =
+          $object_type->new( current_user => Jifty->web->current_user );
+        my $object_id = $self->argument_value('object_id');
+        $object->load($object_id);
+        unless ( $object->id ) {
+            Jifty->log->error("couldn't load $object_type #$object_id");
+            return;
+        }
+
+        $self->object($object);
+    }
+    else {
+        Jifty->log->error("object type '$object_type' is incorrect");
+        return;
+    }
 
+    for my $arg ( $self->argument_names ) {
+        next
+          unless ( $arg =~ /^rights_(\d+)$/ );
+
+        my $principal_id = $1;
+
+        my @rights;
+        my $value = $self->argument_value($arg);
+        if ( UNIVERSAL::isa( $self->argument_value($arg), 'ARRAY' ) ) {
+            @rights = @$value;
+        }
+        else {
+            @rights = $value;
+        }
+
+        @rights = grep $_, @rights;
+        next unless @rights;
+
+        my $principal =
+          RT::Model::Principal->new( current_user => Jifty->web->current_user );
+        $principal->load($principal_id);
+
+        my $current_rights = $self->default_value($principal_id);
+        my %current_rights = map { $_ => 1 } @$current_rights;
+        my %rights         = map { $_ => 1 } @rights;
+
+        for my $right ( keys %current_rights ) {
+            next if $rights{$right};
+            my ( $val, $msg ) =
+              $principal->revoke_right( object => $self->object, right => $right );
+            Jifty->log->error($msg) unless $val;
+        }
+
+        for my $right ( keys %rights ) {
+            next if $current_rights{$right};
+            my ( $val, $msg ) =
+              $principal->grant_right( object => $self->object, right => $right );
+            Jifty->log->error($msg) unless $val;
+        }
     }
 
+    $self->report_success;
     return 1;
 }
 
@@ -81,14 +146,14 @@ sub available_values {
 
 sub default_value {
     my $self  = shift;
-    my $group = shift;
+    my $principal_id = shift;
 
     my $object = $self->object;
     my $acl_obj =
       RT::Model::ACECollection->new( current_user => Jifty->web->current_user );
     my $ACE = RT::Model::ACE->new( current_user => Jifty->web->current_user );
     $acl_obj->limit_to_object($object);
-    $acl_obj->limit_to_principal( id => $group->principal_id );
+    $acl_obj->limit_to_principal( id => $principal_id );
     $acl_obj->order_by( column => 'right_name' );
 
     my @rights;

-----------------------------------------------------------------------


More information about the Rt-commit mailing list