From cd9931467058689b282ce3faa586ba1580971c6a Mon Sep 17 00:00:00 2001
From: Vincent Pelletier <vincent@nexedi.com>
Date: Tue, 8 Jul 2014 17:07:13 +0200
Subject: [PATCH] erp5_administration: Add script to cleanup roles_and_users
 mappings.

Cleans up both the table and it persistent symmetric using current catalog
data.
---
 .../extension.erp5.ERP5Administration.py      | 15 ++-
 .../Base_cleanupRolesAndUsersTable.xml        | 95 +++++++++++++++++++
 .../Base_filterSecurityUidDict.xml            | 28 ++++++
 .../z_delete_from_roles_and_users.xml         | 36 +++++++
 .../z_get_referenced_security_uid_set.xml     | 87 +++++++++++++++++
 bt5/erp5_administration/bt/revision           |  2 +-
 6 files changed, 261 insertions(+), 2 deletions(-)
 create mode 100644 bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_cleanupRolesAndUsersTable.xml
 create mode 100644 bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_filterSecurityUidDict.xml
 create mode 100644 bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/z_delete_from_roles_and_users.xml
 create mode 100644 bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/z_get_referenced_security_uid_set.xml

diff --git a/bt5/erp5_administration/ExtensionTemplateItem/portal_components/extension.erp5.ERP5Administration.py b/bt5/erp5_administration/ExtensionTemplateItem/portal_components/extension.erp5.ERP5Administration.py
index e1ef14a774..1fe2860290 100644
--- a/bt5/erp5_administration/ExtensionTemplateItem/portal_components/extension.erp5.ERP5Administration.py
+++ b/bt5/erp5_administration/ExtensionTemplateItem/portal_components/extension.erp5.ERP5Administration.py
@@ -180,4 +180,17 @@ def checkPythonSourceCodeAsJSON(self, data):
       message_dict['type'] = 'warning'
 
   self.REQUEST.RESPONSE.setHeader('content-type', 'application/json')
-  return json.dumps(dict(annotations=message_list))
\ No newline at end of file
+  return json.dumps(dict(annotations=message_list))
+
+def filterSecurityUidDict(security_uid_dict, referenced_security_uid_set):
+  """
+  Removes from security_uid_dict entries whose value is not present in referenced_security_uid_set.
+  Returns the list of uids dropped.
+  """
+  result = []
+  append = result.append
+  for key, value in list(security_uid_dict.items()):
+    if value not in referenced_security_uid_set:
+      append(value)
+      del security_uid_dict[key]
+  return result
\ No newline at end of file
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_cleanupRolesAndUsersTable.xml b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_cleanupRolesAndUsersTable.xml
new file mode 100644
index 0000000000..541bc58278
--- /dev/null
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_cleanupRolesAndUsersTable.xml
@@ -0,0 +1,95 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="PythonScript" module="Products.PythonScripts.PythonScript"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>Script_magic</string> </key>
+            <value> <int>3</int> </value>
+        </item>
+        <item>
+            <key> <string>_bind_names</string> </key>
+            <value>
+              <object>
+                <klass>
+                  <global name="NameAssignments" module="Shared.DC.Scripts.Bindings"/>
+                </klass>
+                <tuple/>
+                <state>
+                  <dictionary>
+                    <item>
+                        <key> <string>_asgns</string> </key>
+                        <value>
+                          <dictionary>
+                            <item>
+                                <key> <string>name_container</string> </key>
+                                <value> <string>container</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_context</string> </key>
+                                <value> <string>context</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_m_self</string> </key>
+                                <value> <string>script</string> </value>
+                            </item>
+                            <item>
+                                <key> <string>name_subpath</string> </key>
+                                <value> <string>traverse_subpath</string> </value>
+                            </item>
+                          </dictionary>
+                        </value>
+                    </item>
+                  </dictionary>
+                </state>
+              </object>
+            </value>
+        </item>
+        <item>
+            <key> <string>_body</string> </key>
+            <value> <string>context.z_delete_from_roles_and_users(\n
+  uid=context.Base_filterSecurityUidDict(\n
+    context.getPortalObject().portal_catalog.getSQLCatalog(catalog_id).security_uid_dict,\n
+    {x.security_uid for x in context.z_get_referenced_security_uid_set()},\n
+  ),\n
+)\n
+</string> </value>
+        </item>
+        <item>
+            <key> <string>_params</string> </key>
+            <value> <string>catalog_id=None</string> </value>
+        </item>
+        <item>
+            <key> <string>guard</string> </key>
+            <value>
+              <persistent> <string encoding="base64">AAAAAAAAAAI=</string> </persistent>
+            </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>Base_cleanupRolesAndUsersTable</string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+  <record id="2" aka="AAAAAAAAAAI=">
+    <pickle>
+      <global name="Guard" module="Products.DCWorkflow.Guard"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>roles</string> </key>
+            <value>
+              <tuple>
+                <string>Manager</string>
+              </tuple>
+            </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_filterSecurityUidDict.xml b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_filterSecurityUidDict.xml
new file mode 100644
index 0000000000..89629ea91f
--- /dev/null
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/Base_filterSecurityUidDict.xml
@@ -0,0 +1,28 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="ExternalMethod" module="Products.ExternalMethod.ExternalMethod"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_function</string> </key>
+            <value> <string>filterSecurityUidDict</string> </value>
+        </item>
+        <item>
+            <key> <string>_module</string> </key>
+            <value> <string>ERP5Administration</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>Base_filterSecurityUidDict</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/z_delete_from_roles_and_users.xml b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/z_delete_from_roles_and_users.xml
new file mode 100644
index 0000000000..b92f56dbfd
--- /dev/null
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/z_delete_from_roles_and_users.xml
@@ -0,0 +1,36 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="SQL" module="Products.ZSQLMethods.SQL"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>arguments_src</string> </key>
+            <value> <string>uid</string> </value>
+        </item>
+        <item>
+            <key> <string>connection_id</string> </key>
+            <value> <string>erp5_sql_connection</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>z_delete_from_roles_and_users</string> </value>
+        </item>
+        <item>
+            <key> <string>src</string> </key>
+            <value> <string encoding="cdata"><![CDATA[
+
+delete from roles_and_users where <dtml-sqltest uid type=int op=eq multiple>
+
+]]></string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/z_get_referenced_security_uid_set.xml b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/z_get_referenced_security_uid_set.xml
new file mode 100644
index 0000000000..d4c675e084
--- /dev/null
+++ b/bt5/erp5_administration/SkinTemplateItem/portal_skins/erp5_administration/z_get_referenced_security_uid_set.xml
@@ -0,0 +1,87 @@
+<?xml version="1.0"?>
+<ZopeData>
+  <record id="1" aka="AAAAAAAAAAE=">
+    <pickle>
+      <global name="SQL" module="Products.ZSQLMethods.SQL"/>
+    </pickle>
+    <pickle>
+      <dictionary>
+        <item>
+            <key> <string>_col</string> </key>
+            <value>
+              <list>
+                <dictionary>
+                  <item>
+                      <key> <string>name</string> </key>
+                      <value> <string>security_uid</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>null</string> </key>
+                      <value> <int>1</int> </value>
+                  </item>
+                  <item>
+                      <key> <string>type</string> </key>
+                      <value> <string>i</string> </value>
+                  </item>
+                  <item>
+                      <key> <string>width</string> </key>
+                      <value> <int>4</int> </value>
+                  </item>
+                </dictionary>
+              </list>
+            </value>
+        </item>
+        <item>
+            <key> <string>allow_simple_one_argument_traversal</string> </key>
+            <value>
+              <none/>
+            </value>
+        </item>
+        <item>
+            <key> <string>arguments_src</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>cache_time_</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>class_file_</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>class_name_</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>connection_hook</string> </key>
+            <value> <string></string> </value>
+        </item>
+        <item>
+            <key> <string>connection_id</string> </key>
+            <value> <string>erp5_sql_connection</string> </value>
+        </item>
+        <item>
+            <key> <string>id</string> </key>
+            <value> <string>z_get_referenced_security_uid_set</string> </value>
+        </item>
+        <item>
+            <key> <string>max_cache_</string> </key>
+            <value> <int>100</int> </value>
+        </item>
+        <item>
+            <key> <string>max_rows_</string> </key>
+            <value> <int>0</int> </value>
+        </item>
+        <item>
+            <key> <string>src</string> </key>
+            <value> <string>select distinct security_uid from catalog</string> </value>
+        </item>
+        <item>
+            <key> <string>title</string> </key>
+            <value> <string></string> </value>
+        </item>
+      </dictionary>
+    </pickle>
+  </record>
+</ZopeData>
diff --git a/bt5/erp5_administration/bt/revision b/bt5/erp5_administration/bt/revision
index 9e42f3ef01..09df927592 100644
--- a/bt5/erp5_administration/bt/revision
+++ b/bt5/erp5_administration/bt/revision
@@ -1 +1 @@
-165
+166
\ No newline at end of file
-- 
2.30.9