From c2f6c590d21f37e111d459911661d2d04a564436 Mon Sep 17 00:00:00 2001
From: Ayush Tiwari <ayush.tiwari@nexedi.com>
Date: Tue, 6 Mar 2018 17:13:11 +0100
Subject: [PATCH] Catalog, Business Template: Remove expression_instance
 property from CatalogFilter property sheets

Also, while exporting catalog methods, explicitly check for `expression_instance` property.
Now we keep expression_instance property in a volatile attribute, so we should prefer using
it.
---
 product/ERP5/Document/BusinessTemplate.py     | 18 +++++-----
 .../expression_instance_property.xml          | 34 -------------------
 product/ERP5Catalog/CatalogTool.py            |  1 -
 product/ERP5Type/tests/testERP5Type.py        |  1 -
 4 files changed, 9 insertions(+), 45 deletions(-)
 delete mode 100644 product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/CatalogFilter/expression_instance_property.xml

diff --git a/product/ERP5/Document/BusinessTemplate.py b/product/ERP5/Document/BusinessTemplate.py
index 01abc9c0ee..5e05371419 100644
--- a/product/ERP5/Document/BusinessTemplate.py
+++ b/product/ERP5/Document/BusinessTemplate.py
@@ -116,7 +116,6 @@ catalog_method_list = ('_is_catalog_list_method_archive',
                        '_is_filtered_archive',)
 
 catalog_method_filter_list = ('_filter_expression_archive',
-                              '_filter_expression_instance_archive',
                               '_filter_expression_cache_key_archive',
                               '_filter_type_archive',)
 
@@ -616,8 +615,12 @@ class BaseTemplateItem(Implicit, Persistent):
       # PythonScript covers both Zope Python scripts
       # and ERP5 Python Scripts
       if isinstance(obj, PythonScript):
+        # `expression_instance` is included so as to add compatibility for
+        # exporting older catalog methods which might have them as their
+        # properties or in their attribute dict.
         attr_set.update(('func_code', 'func_defaults', '_code',
-                         '_lazy_compilation', 'Python_magic'))
+                         '_lazy_compilation', 'Python_magic',
+                         'expression_instance'))
         for attr in 'errors', 'warnings', '_proxy_roles':
           if not obj.__dict__.get(attr, 1):
             delattr(obj, attr)
@@ -625,7 +628,10 @@ class BaseTemplateItem(Implicit, Persistent):
         attr_set.update(('_EtagSupport__etag', 'size'))
       # SQL covers both ZSQL Methods and ERP5 SQL Methods
       elif isinstance(obj, SQL):
-        attr_set.update(('_arg', 'template'))
+        # `expression_instance` is included so as to add compatibility for
+        # exporting older catalog methods which might have them as their
+        # properties or in their attribute dict.
+        attr_set.update(('_arg', 'template', 'expression_instance'))
       elif interfaces.IIdGenerator.providedBy(obj):
         attr_set.update(('last_max_id_dict', 'last_id_dict'))
       elif classname == 'Types Tool' and klass.__module__ == 'erp5.portal_type':
@@ -3068,14 +3074,8 @@ class CatalogMethodTemplateItem(ObjectTemplateItem):
       #    migration.
       if self._is_filtered_archive.get(method_id, 0):
         expression = self._filter_expression_archive[method_id]
-        if expression and expression.strip():
-          # only compile non-empty expressions
-          expr_instance = Expression(expression)
-        else:
-          expr_instance = None
         method.setFiltered(1)
         method.setExpression(expression)
-        method.setExpressionInstance(expr_instance)
         method.setExpressionCacheKey(
           self._filter_expression_cache_key_archive.get(method_id, ()))
         method.setTypeList(self._filter_type_archive.get(method_id, ()))
diff --git a/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/CatalogFilter/expression_instance_property.xml b/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/CatalogFilter/expression_instance_property.xml
deleted file mode 100644
index 25e4abf5a1..0000000000
--- a/product/ERP5/bootstrap/erp5_core/PropertySheetTemplateItem/portal_property_sheets/CatalogFilter/expression_instance_property.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0"?>
-<ZopeData>
-  <record id="1" aka="AAAAAAAAAAE=">
-    <pickle>
-      <global name="Standard Property" module="erp5.portal_type"/>
-    </pickle>
-    <pickle>
-      <dictionary>
-        <item>
-            <key> <string>categories</string> </key>
-            <value>
-              <tuple>
-                <string>elementary_type/object</string>
-              </tuple>
-            </value>
-        </item>
-        <item>
-            <key> <string>description</string> </key>
-            <value>
-              <none/>
-            </value>
-        </item>
-        <item>
-            <key> <string>id</string> </key>
-            <value> <string>expression_instance_property</string> </value>
-        </item>
-        <item>
-            <key> <string>portal_type</string> </key>
-            <value> <string>Standard Property</string> </value>
-        </item>
-      </dictionary>
-    </pickle>
-  </record>
-</ZopeData>
diff --git a/product/ERP5Catalog/CatalogTool.py b/product/ERP5Catalog/CatalogTool.py
index 7b3677ea62..f8c84a1915 100644
--- a/product/ERP5Catalog/CatalogTool.py
+++ b/product/ERP5Catalog/CatalogTool.py
@@ -423,7 +423,6 @@ class CatalogTool (UniqueObject, ZCatalog, CMFCoreCatalogTool, ActiveObject):
             new_method.setTypeList(filter_['type'])
             new_method.setExpressionCacheKeyList(filter_['expression_cache_key'])
             new_method.setExpression(filter_['expression'])
-            new_method.setExpressionInstance(filter_['expression_instance'])
         # Delete filter_dict before migration of catalog object(s)
         del obj.filter_dict
 
diff --git a/product/ERP5Type/tests/testERP5Type.py b/product/ERP5Type/tests/testERP5Type.py
index 28a0a5d084..c9918752a3 100644
--- a/product/ERP5Type/tests/testERP5Type.py
+++ b/product/ERP5Type/tests/testERP5Type.py
@@ -3261,7 +3261,6 @@ class TestAccessControl(ERP5TypeTestCase):
     method = self.getCatalogTool().getSQLCatalog()._getOb('z_catalog_object_list')
     method.setFiltered(1)
     method.setExpression(self.expression)
-    method.setExpressionInstance(Expression(self.expression))
 
     createZODBPythonScript(self.getSkinsTool().custom,
                            'Base_immediateReindexObject',
-- 
2.30.9