From f4f16af8ac6c2bb1d5561bd85b4908fd3f9e1dbb Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 12 Oct 2010 15:49:20 -0700 Subject: Add a basic group deletion for moderator users. --- classes/Profile.php | 1 + 1 file changed, 1 insertion(+) (limited to 'classes') diff --git a/classes/Profile.php b/classes/Profile.php index 3844077e6..12ce5d9b6 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -854,6 +854,7 @@ class Profile extends Memcached_DataObject case Right::SANDBOXUSER: case Right::SILENCEUSER: case Right::DELETEUSER: + case Right::DELETEGROUP: $result = $this->hasRole(Profile_role::MODERATOR); break; case Right::CONFIGURESITE: -- cgit v1.2.3-54-g00ecf From 3579ccac8e2b334d4caef57ffe5b01be21a5cf11 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 12 Oct 2010 16:13:07 -0700 Subject: Cascading deletion for user_group; doesn't yet work properly with caching. --- classes/User_group.php | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) (limited to 'classes') diff --git a/classes/User_group.php b/classes/User_group.php index cfdcef290..fabb8e8d5 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -547,4 +547,36 @@ class User_group extends Memcached_DataObject $group->query('COMMIT'); return $group; } + + /** + * Handle cascading deletion, on the model of notice and profile. + * + * Pretty sure some caching won't get handled properly here. + */ + function delete() + { + if ($this->id) { + $related = array('Group_inbox', + 'Group_alias', + 'Group_block', + 'Group_member', + 'Local_group', + 'Related_group', + ); + Event::handle('UserGroupDeleteRelated', array($this, &$related)); + + foreach ($related as $cls) { + $inst = new $cls(); + $inst->group_id = $this->id; + $inst->delete(); + } + + $inst = new Related_group(); + $inst->related_group_id = $this->id; + $inst->delete(); + } else { + common_log(LOG_WARN, "Ambiguous user_group->delete(); skipping related tables."); + } + parent::delete(); + } } -- cgit v1.2.3-54-g00ecf From 112b6c40793a18262425ca039e4fe4a6eb68bce4 Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Tue, 12 Oct 2010 16:29:13 -0700 Subject: Improve cache-friendliness of user_group->delete(). Doesn't clear all possible cached entries, but this should get the ones that matter most: lookups by id, nickname, and alias. This should ensure that if a group name gets reused as a new group or alias, it should work properly. There are some user-visible areas that aren't clear such as the 'top groups' lists on the GroupsAction sidebar; if a deleted group appears in those lists it'll go away within an hour when the cached query expires. --- classes/User_group.php | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) (limited to 'classes') diff --git a/classes/User_group.php b/classes/User_group.php index fabb8e8d5..1f7005785 100644 --- a/classes/User_group.php +++ b/classes/User_group.php @@ -551,29 +551,39 @@ class User_group extends Memcached_DataObject /** * Handle cascading deletion, on the model of notice and profile. * - * Pretty sure some caching won't get handled properly here. + * This should handle freeing up cached entries for the group's + * id, nickname, URI, and aliases. There may be other areas that + * are not de-cached in the UI, including the sidebar lists on + * GroupsAction */ function delete() { if ($this->id) { + // Safe to delete in bulk for now $related = array('Group_inbox', - 'Group_alias', 'Group_block', 'Group_member', - 'Local_group', - 'Related_group', - ); + 'Related_group'); Event::handle('UserGroupDeleteRelated', array($this, &$related)); - foreach ($related as $cls) { $inst = new $cls(); $inst->group_id = $this->id; $inst->delete(); } + // And related groups in the other direction... $inst = new Related_group(); $inst->related_group_id = $this->id; $inst->delete(); + + // Aliases and the local_group entry need to be cleared explicitly + // or we'll miss clearing some cache keys; that can make it hard + // to create a new group with one of those names or aliases. + $this->setAliases(array()); + $local = Local_group::staticGet('group_id', $this->id); + if ($local) { + $local->delete(); + } } else { common_log(LOG_WARN, "Ambiguous user_group->delete(); skipping related tables."); } -- cgit v1.2.3-54-g00ecf