Bivio::Biz::Model::GroupUserList
# Copyright (c) 2008-2010 bivio Software, Inc. All Rights Reserved. # $Id$ package Bivio::Biz::Model::GroupUserList; use strict; use Bivio::Base 'Model.RoleBaseList'; b_use('IO.ClassLoaderAUTOLOAD'); my($_AUL) = b_use('Model.AdmUserList'); my($_R) = b_use('Auth.Role'); my($_SA) = b_use('Type.StringArray'); my($_T) = b_use('FacadeComponent.Text'); my($_C) = b_use('IO.Config'); sub LOAD_ALL_SEARCH_STRING { return shift->delegate_method($_AUL); } sub NAME_COLUMNS { return shift->delegate_method($_AUL); } sub NAME_SORT_COLUMNS { return shift->delegate_method($_AUL); } sub can_add_user { return 1; } sub can_change_privileges { my($self, $task_id) = @_; return $self->req->can_user_execute_task($task_id) && $self->get('is_not_withdrawn'); } sub can_substitute_user { my($self) = @_; return $self->new_other( $_C->if_version(10, sub {'SiteAdminSubstituteUserForm'}, sub {'AdmSubstituteUserForm'}, ), )->can_substitute_user($self->get('RealmUser.user_id')); } sub internal_initialize { my($self) = @_; return $self->merge_initialize_info($self->SUPER::internal_initialize, { version => 1, primary_key => [[qw(RealmUser.user_id User.user_id Email.realm_id RealmOwner.realm_id)]], order_by => [ @{$self->NAME_SORT_COLUMNS}, 'Email.email', ], other => [ @{$self->NAME_COLUMNS}, 'RealmOwner.display_name', 'RealmOwner.name', { name => 'display_name', type => 'Line', constraint => 'NOT_NULL', }, [ 'Email.location', [$self->get_instance('Email')->DEFAULT_LOCATION], ], { name => 'privileges', type => 'StringArray', constraint => 'NONE', }, { name => 'is_not_withdrawn', type => 'Boolean', constraint => 'NONE', }, 'UserRealmSubscription.is_subscribed', [qw(RealmUser.realm_id UserRealmSubscription.realm_id(+))], [qw(RealmUser.user_id UserRealmSubscription.user_id(+))], ], group_by => [ @{$self->NAME_SORT_COLUMNS}, @{$self->NAME_COLUMNS}, qw( RealmUser.user_id RealmUser.realm_id RealmUser.role RealmUser.creation_date_time RealmOwner.display_name RealmOwner.name Email.email Email.location UserRealmSubscription.is_subscribed ), ], other_query_keys => [qw(b_filter b_privilege)], auth_id => ['RealmUser.realm_id'], }); } sub internal_post_load_row { my($self) = shift; return 0 unless $self->SUPER::internal_post_load_row(@_); my($row) = @_; _privileges($self, $row); return $self->delegate_method($_AUL, @_); } sub internal_pre_load { my($self) = @_; my($super) = shift->SUPER::internal_pre_load(@_); return $super unless my $qf = $self->ureq('Model.GroupUserQueryForm'); my($role) = $qf->get_privilege_role; return $super unless $role; $super = join( ' AND ', $super || (), $self->internal_role_exists_statement( $qf->get_subscribed ? Auth_Role('MAIL_RECIPIENT') : $role), ); return $super; } sub internal_prepare_statement { my($self) = shift; my($stmt) = @_; #TODO: Move internal_prepare_statement out of AdmUserList into RoleBaseList(?) # or just here. $self->delegate_method($_AUL, @_); if (my $qf = $self->ureq('Model.GroupUserQueryForm')) { $qf->filter_statement($stmt, { match_fields => [ qr/\@/ => 'Email.email', qr/^\w/ => 'RealmOwner.display_name', ], }); $stmt->where([ 'UserRealmSubscription.is_subscribed' => [1], ]) if $qf->get_subscribed; } return $self->SUPER::internal_prepare_statement(@_); } sub internal_qualifying_roles { my($self) = @_; my($m) = $self->ureq('Model.GroupUserQueryForm'); my($role) = $m && $m->get_privilege_role; return $role && ref($role) && $role->eq_withdrawn ? shift->SUPER::internal_qualifying_roles(@_) : [grep(! $_->eq_withdrawn, @{$self->ROLES_ORDER})]; } sub internal_role_exists_statement { my($self, $role) = @_; return <<"EOF"; EXISTS ( SELECT ru.role FROM realm_user_t ru WHERE ru.realm_id = realm_user_t.realm_id AND ru.user_id = realm_user_t.user_id AND ru.role = @{[$role->as_sql_param]} ) EOF } sub privilege_name { my(undef, $name, $req) = @_; return (FacadeComponent_Text()->get_from_source($req) ->unsafe_get_value("GroupUserList.privileges_name.$name"))[0]; } sub _privileges { my($self, $row) = @_; my($main, $aux) = $self->roles_by_category($row->{roles}); $row->{is_not_withdrawn} = 1; $row->{privileges} = $_SA->new([ map({ $row->{is_not_withdrawn} = 0 if $_->eq_withdrawn; $self->privilege_name($_->get_name, $self->req) || $_->get_short_desc, } @$main ? $main->[0] : (), grep(!$_->eq_mail_recipient, @$aux), ), grep($_->eq_mail_recipient, @$aux) && $row->{'UserRealmSubscription.is_subscribed'} ? $self->privilege_name( 'UserRealmSubscription.is_subscribed', $self->req) : (), ]); return; } 1;