Replace fields that use a group that is deleted with a safe group, like Admin. rfe#76
This commit is contained in:
parent
b788f82b0b
commit
fb33138e33
3 changed files with 300 additions and 6 deletions
|
|
@ -1,6 +1,7 @@
|
||||||
7.7.11
|
7.7.11
|
||||||
- Fixed a bug where empty version tags were not deleted. (Martin Kamerbeek / Oqapi)
|
- Fixed a bug where empty version tags were not deleted. (Martin Kamerbeek / Oqapi)
|
||||||
- fixed: deploying a package doesn't commit version tag with autocommit on
|
- fixed: deploying a package doesn't commit version tag with autocommit on
|
||||||
|
- fixed rfe #76: group delete causes problems
|
||||||
|
|
||||||
7.7.10
|
7.7.10
|
||||||
- Made a change to LDAP auth that adds an OR to that query so that it also searches for a row with fieldData REGEXP '^uid=(value-from-ldap-directory-server),'. (Wes Morgan)
|
- Made a change to LDAP auth that adds an OR to that query so that it also searches for a row with fieldData REGEXP '^uid=(value-from-ldap-directory-server),'. (Wes Morgan)
|
||||||
|
|
|
||||||
|
|
@ -19,6 +19,8 @@ use Tie::CPHash;
|
||||||
use WebGUI::LDAPLink;
|
use WebGUI::LDAPLink;
|
||||||
use WebGUI::Macro;
|
use WebGUI::Macro;
|
||||||
use WebGUI::Utility;
|
use WebGUI::Utility;
|
||||||
|
use WebGUI::Pluggable;
|
||||||
|
use WebGUI::International;
|
||||||
|
|
||||||
|
|
||||||
=head1 NAME
|
=head1 NAME
|
||||||
|
|
@ -261,12 +263,13 @@ Deletes this group from the group related tables in the database and calls clear
|
||||||
=cut
|
=cut
|
||||||
|
|
||||||
sub delete {
|
sub delete {
|
||||||
my $self = shift;
|
my $self = shift;
|
||||||
$self->clearCaches;
|
$self->resetGroupFields;
|
||||||
$self->session->db->write("delete from groups where groupId=?", [$self->getId]);
|
$self->clearCaches;
|
||||||
$self->session->db->write("delete from groupings where groupId=?", [$self->getId]);
|
$self->session->db->write("delete from groups where groupId=?", [$self->getId]);
|
||||||
$self->session->db->write("delete from groupGroupings where inGroup=? or groupId=?", [$self->getId, $self->getId]);
|
$self->session->db->write("delete from groupings where groupId=?", [$self->getId]);
|
||||||
undef $self;
|
$self->session->db->write("delete from groupGroupings where inGroup=? or groupId=?", [$self->getId, $self->getId]);
|
||||||
|
undef $self;
|
||||||
}
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
@ -1139,6 +1142,117 @@ sub new {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
|
=head2 resetGroupFields ( )
|
||||||
|
|
||||||
|
Looks through WebGUI and resets any group field that it can find, that uses this group,
|
||||||
|
to the admin group, 3. Called internally by delete.
|
||||||
|
|
||||||
|
Currently handes these areas:
|
||||||
|
|
||||||
|
=over 4
|
||||||
|
|
||||||
|
=item *
|
||||||
|
|
||||||
|
Anything in an Asset definition that is labeled as type group. JSON data is not handled.
|
||||||
|
|
||||||
|
=item *
|
||||||
|
|
||||||
|
Everything in Operation/Settings, from its definition subroutine.
|
||||||
|
|
||||||
|
=item *
|
||||||
|
|
||||||
|
Settings fields hand picked from Shop/Admin and Account/FriendManager.
|
||||||
|
|
||||||
|
=item *
|
||||||
|
|
||||||
|
Any Workflow Activity data from the definition that is labeled as type group.
|
||||||
|
|
||||||
|
=back
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub resetGroupFields {
|
||||||
|
my $self = shift;
|
||||||
|
my $gid = $self->getId;
|
||||||
|
my $session = $self->session;
|
||||||
|
my $db = $session->db;
|
||||||
|
my $config = $session->config;
|
||||||
|
my $assets = $config->get('assets');
|
||||||
|
my $tableCache = {};
|
||||||
|
|
||||||
|
##Note, I did assets in SQL instead of using the API because you would have to
|
||||||
|
##instanciate every version of the asset that used the group. This should be much quicker
|
||||||
|
ASSET: foreach my $asset (keys %{ $assets }) {
|
||||||
|
my $definition = WebGUI::Pluggable::instanciate($asset, 'definition', [$session]);
|
||||||
|
SUBDEF: foreach my $subdef (@{ $definition }) {
|
||||||
|
next SUBDEF if exists $tableCache->{$subdef->{tableName}};
|
||||||
|
PROP: while (my ($fieldName, $properties) = each %{ $subdef->{properties} }) {
|
||||||
|
next PROP unless $properties->{fieldType} eq 'group';
|
||||||
|
push @{ $tableCache->{$subdef->{tableName}} }, $fieldName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
##VersionTags
|
||||||
|
$tableCache->{assetVersionTag} = ['groupToUse'];
|
||||||
|
$tableCache->{adSpace} = ['groupToPurchase'];
|
||||||
|
foreach my $tableName (keys %{ $tableCache }) {
|
||||||
|
foreach my $fieldName (@{ $tableCache->{$tableName} }) {
|
||||||
|
my $sql = sprintf 'UPDATE %s SET %s=3 where %s=?',
|
||||||
|
$db->dbh->quote_identifier($tableName),
|
||||||
|
(($db->dbh->quote_identifier($fieldName)) x 2);
|
||||||
|
$db->write($sql, [ $gid ]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SETTINGS: {
|
||||||
|
my $setting = $session->setting;
|
||||||
|
my $i18n = WebGUI::International->new($session);
|
||||||
|
my $definition = WebGUI::Pluggable::run('WebGUI::Operation::Settings', 'definition', [$session, $i18n]);
|
||||||
|
FIELD: foreach my $field (@{ $definition }) {
|
||||||
|
next FIELD unless $field->{fieldType} eq 'group'
|
||||||
|
and $setting->get($field->{name}) eq $gid;
|
||||||
|
$setting->set($field->{name}, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
##Settings in the settings table not from Operation/Settings. These should all
|
||||||
|
##be moved to definition style subroutines for future auto-probing.
|
||||||
|
AUX_SETTINGS: {
|
||||||
|
##These are extra fields
|
||||||
|
my $setting = $session->setting;
|
||||||
|
my @extraFields = qw/groupIdCashier groupIdAdminCommerce/; ##Shop/Admin
|
||||||
|
push @extraFields, qw/groupIdAdminFriends groupsToManageFriends/; ##Account/FriendManager
|
||||||
|
FIELD: foreach my $field (@extraFields) {
|
||||||
|
next FIELD unless $setting->get($field) eq $gid;
|
||||||
|
$setting->set($field, 3);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ACTIVITY: {
|
||||||
|
my $workflowActivities = $config->get('workflowActivities');
|
||||||
|
my @activities;
|
||||||
|
foreach my $wfActivities (values %{ $workflowActivities} ) {
|
||||||
|
push @activities, @{ $wfActivities };
|
||||||
|
}
|
||||||
|
use Data::Dumper;
|
||||||
|
warn Dumper \@activities;
|
||||||
|
foreach my $activity (@activities) {
|
||||||
|
my $definition = WebGUI::Pluggable::instanciate($activity, 'definition', [$session]);
|
||||||
|
my $sth = $db->prepare('UPDATE WorkflowActivityData set value=3 where name=? and value=?');
|
||||||
|
SUBDEF: foreach my $subdef (@{ $definition }) {
|
||||||
|
PROP: while (my ($fieldName, $properties) = each %{ $subdef->{properties} }) {
|
||||||
|
next PROP unless $properties->{fieldType} eq 'group';
|
||||||
|
warn $fieldName;
|
||||||
|
warn $gid;
|
||||||
|
$sth->execute([$fieldName, $gid]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
##Inbox messages, inbox table
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
#-------------------------------------------------------------------
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
=head2 scratchFilter ( [ value ] )
|
=head2 scratchFilter ( [ value ] )
|
||||||
|
|
|
||||||
179
t/Group/resetGroupFields.t
Normal file
179
t/Group/resetGroupFields.t
Normal file
|
|
@ -0,0 +1,179 @@
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
# WebGUI is Copyright 2001-2009 Plain Black Corporation.
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
# Please read the legal notices (docs/legal.txt) and the license
|
||||||
|
# (docs/license.txt) that came with this distribution before using
|
||||||
|
# this software.
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
# http://www.plainblack.com info@plainblack.com
|
||||||
|
#-------------------------------------------------------------------
|
||||||
|
|
||||||
|
use FindBin;
|
||||||
|
use strict;
|
||||||
|
use lib "$FindBin::Bin/../lib";
|
||||||
|
|
||||||
|
use WebGUI::Test;
|
||||||
|
use WebGUI::Session;
|
||||||
|
use WebGUI::Asset;
|
||||||
|
use WebGUI::Group;
|
||||||
|
|
||||||
|
use Test::More;
|
||||||
|
use Test::Deep;
|
||||||
|
|
||||||
|
plan tests => 10;
|
||||||
|
|
||||||
|
my $session = WebGUI::Test->session;
|
||||||
|
|
||||||
|
my $assetGroup = WebGUI::Group->new($session, 'new');
|
||||||
|
WebGUI::Test->groupsToDelete($assetGroup);
|
||||||
|
|
||||||
|
my $settingGroup = WebGUI::Group->new($session, 'new');
|
||||||
|
WebGUI::Test->groupsToDelete($settingGroup);
|
||||||
|
|
||||||
|
my $activityGroup = WebGUI::Group->new($session, 'new');
|
||||||
|
WebGUI::Test->groupsToDelete($activityGroup);
|
||||||
|
|
||||||
|
my $home = WebGUI::Asset->getDefault($session);
|
||||||
|
|
||||||
|
my $snippet1 = $home->addChild({
|
||||||
|
className => 'WebGUI::Asset::Snippet',
|
||||||
|
groupIdEdit => $assetGroup->getId,
|
||||||
|
groupIdView => 7,
|
||||||
|
snippet => 'one',
|
||||||
|
});
|
||||||
|
|
||||||
|
my $snippet2 = $home->addChild({
|
||||||
|
className => 'WebGUI::Asset::Snippet',
|
||||||
|
groupIdEdit => 7,
|
||||||
|
groupIdView => 7,
|
||||||
|
snippet => 'two',
|
||||||
|
});
|
||||||
|
|
||||||
|
my $snippet3 = $home->addChild({
|
||||||
|
className => 'WebGUI::Asset::Snippet',
|
||||||
|
groupIdEdit => $assetGroup->getId,
|
||||||
|
groupIdView => $assetGroup->getId,
|
||||||
|
snippet => 'three',
|
||||||
|
});
|
||||||
|
|
||||||
|
my $gallery1 = $home->addChild({
|
||||||
|
className => 'WebGUI::Asset::Wobject::Gallery',
|
||||||
|
groupIdView => 7,
|
||||||
|
groupIdEdit => $assetGroup->getId,
|
||||||
|
groupIdAddComment => $assetGroup->getId,
|
||||||
|
});
|
||||||
|
|
||||||
|
cmp_deeply(
|
||||||
|
$gallery1->get,
|
||||||
|
superhashof({
|
||||||
|
groupIdEdit => $assetGroup->getId,
|
||||||
|
groupIdView => 7,
|
||||||
|
groupIdAddComment => $assetGroup->getId,
|
||||||
|
}),
|
||||||
|
'gallery set up correctly'
|
||||||
|
);
|
||||||
|
|
||||||
|
cmp_deeply(
|
||||||
|
$snippet1->get,
|
||||||
|
superhashof({
|
||||||
|
groupIdEdit => $assetGroup->getId,
|
||||||
|
groupIdView => 7,
|
||||||
|
}),
|
||||||
|
'groupIdEdit updated on test snippet'
|
||||||
|
);
|
||||||
|
|
||||||
|
my $workflow = WebGUI::Workflow->create($session,
|
||||||
|
{
|
||||||
|
enabled => 1,
|
||||||
|
objectType => 'User',
|
||||||
|
mode => 'realtime',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
WebGUI::Test->originalConfig('workflowActivities');
|
||||||
|
$session->config->addToArray('workflowActivities/User', 'WebGUI::Workflow::Activity::AddUserToGroup');
|
||||||
|
|
||||||
|
my $userActivity = $workflow->addActivity('WebGUI::Workflow::Activity::AddUserToGroup');
|
||||||
|
$userActivity->set('className', 'WebGUI::Workflow::Activity::AddUserToGroup');
|
||||||
|
$userActivity->set('groupId', $activityGroup->getId);
|
||||||
|
is($userActivity->get('groupId'), $activityGroup->getId, 'group in Workflow Activity set to test group');
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
#
|
||||||
|
# Asset tests
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
$assetGroup->delete;
|
||||||
|
|
||||||
|
my $newSnippet1 = WebGUI::Asset->newByDynamicClass($session, $snippet1->getId);
|
||||||
|
|
||||||
|
cmp_deeply(
|
||||||
|
$newSnippet1->get,
|
||||||
|
superhashof({
|
||||||
|
groupIdEdit => 3,
|
||||||
|
groupIdView => 7,
|
||||||
|
}),
|
||||||
|
'groupIdEdit updated on test snippet'
|
||||||
|
);
|
||||||
|
|
||||||
|
my $newSnippet2 = WebGUI::Asset->newByDynamicClass($session, $snippet2->getId);
|
||||||
|
|
||||||
|
cmp_deeply(
|
||||||
|
$newSnippet2->get,
|
||||||
|
superhashof({
|
||||||
|
groupIdEdit => 7,
|
||||||
|
groupIdView => 7,
|
||||||
|
}),
|
||||||
|
'other snippet not touched'
|
||||||
|
);
|
||||||
|
|
||||||
|
my $newSnippet3 = WebGUI::Asset->newByDynamicClass($session, $snippet3->getId);
|
||||||
|
|
||||||
|
cmp_deeply(
|
||||||
|
$newSnippet3->get,
|
||||||
|
superhashof({
|
||||||
|
groupIdEdit => 3,
|
||||||
|
groupIdView => 3,
|
||||||
|
}),
|
||||||
|
'multiple fields updated'
|
||||||
|
);
|
||||||
|
|
||||||
|
my $newGallery1 = WebGUI::Asset->newByDynamicClass($session, $gallery1->getId);
|
||||||
|
|
||||||
|
cmp_deeply(
|
||||||
|
$newGallery1->get,
|
||||||
|
superhashof({
|
||||||
|
groupIdEdit => 3,
|
||||||
|
groupIdView => 7,
|
||||||
|
groupIdAddComment => 3,
|
||||||
|
}),
|
||||||
|
'multiple fields and tables updated'
|
||||||
|
);
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
#
|
||||||
|
# Setting tests
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
$session->setting->set('groupIdAdminUser', $settingGroup->getId);
|
||||||
|
|
||||||
|
is($session->setting->get('groupIdAdminUser'), $settingGroup->getId, 'group in Setting set up');
|
||||||
|
|
||||||
|
$settingGroup->delete;
|
||||||
|
|
||||||
|
is($session->setting->get('groupIdAdminUser'), 3, 'group in Setting reset to Admin');
|
||||||
|
|
||||||
|
###################################################################
|
||||||
|
#
|
||||||
|
# Workflow Activity tests
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
$activityGroup->delete;
|
||||||
|
|
||||||
|
my $userActivity2 = WebGUI::Workflow::Activity->new($session, $userActivity->getId);
|
||||||
|
is ($userActivity2->get('groupId'), 3, 'group in Workflow Activity set to Admin');
|
||||||
|
|
||||||
|
WebGUI::Test->tagsToRollback(WebGUI::VersionTag->getWorking($session));
|
||||||
Loading…
Add table
Add a link
Reference in a new issue