From b4f0c21b6afcc25bddcf2cff5a037bde9a6c834a Mon Sep 17 00:00:00 2001
From: Romain Courteaud <romain@nexedi.com>
Date: Wed, 28 Feb 2018 16:59:17 +0000
Subject: [PATCH] [erp5_hal_json_style] Render domain tree for each listbox

---
 .../ERP5Document_getHateoas.py                | 53 ++++++++++++++++++-
 .../test.erp5.testHalJsonStyle.py             |  6 ++-
 2 files changed, 57 insertions(+), 2 deletions(-)

diff --git a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
index fdd6b4e3b5..0d1a481126 100644
--- a/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
+++ b/bt5/erp5_hal_json_style/SkinTemplateItem/portal_skins/erp5_hal_json_style/ERP5Document_getHateoas.py
@@ -148,6 +148,54 @@ def ensureDeserialized(obj):
       return datetime.time(*tuple(map(int, match_obj.groups())))
   return obj
 
+NBSP_UTF8 = u'\xA0'.encode('utf-8')
+def generateDomainTreeList(url_tool, domain_tool, domain, depth, domain_list):
+  if depth:
+    domain_list.append((
+      '%s%s' % (NBSP_UTF8 * 4 * (depth - 1), domain.getTitle()),
+      '/'.join(url_tool.getRelativeContentPath(domain)[2:])
+    ))
+  new_depth = depth + 1
+  for sub_domain in domain_tool.getChildDomainValueList(domain, depth=depth):
+    generateDomainTreeList(url_tool, domain_tool, sub_domain, new_depth, domain_list)
+
+def getDomainSelection(domain_list):
+  root_dict = {}
+
+  if len(domain_list) > 0:
+    category_tool = portal.portal_categories
+    domain_tool = portal.portal_domains
+    preference_tool = portal.portal_preferences
+    url_tool = portal.portal_url
+
+  for base_domain_id in domain_list:
+    domain = None
+    if category_tool is not None:
+      domain = category_tool.restrictedTraverse(base_domain_id, None)
+      if domain is not None :
+
+        root_dict[base_domain_id] = getattr(
+          domain,
+          preference_tool.getPreference(
+            'preferred_category_child_item_list_method_id',
+            'getCategoryChildCompactLogicalPathItemList'
+          )
+        )(local_sort_id=('int_index', 'translated_title'), checked_permission='View',
+          filter_node=0, display_none_category=0)
+
+      elif domain_tool is not None:
+        try:
+          domain = domain_tool.getDomainByPath(base_domain_id, None)
+        except KeyError:
+          domain = None
+        if domain is not None:
+          # XXX Implement recursive fetch
+          domain_list = []
+          generateDomainTreeList(url_tool, domain_tool, domain, 0, domain_list)
+          root_dict[base_domain_id] = domain_list
+
+  return root_dict
+
 
 def getProtectedProperty(document, select):
   """getProtectedProperty is a security-aware substitution for builtin `getattr`
@@ -803,8 +851,11 @@ def renderField(traversed_document, field, form, value=None, meta_type=None, key
         "query": make_query({
           "query": sql_catalog.buildQuery(
             list_method_query_dict,
-            ignore_unknown_columns=True).asSearchTextExpression(sql_catalog)})}
+            ignore_unknown_columns=True).asSearchTextExpression(sql_catalog)})},
+      "domain_root_list": field.get_value("domain_root_list")
     })
+    result["domain_dict"] = getDomainSelection([x[0] for x in result["domain_root_list"]])
+
     if (list_method_custom is not None):
       result["list_method_template"] = list_method_custom
     return result
diff --git a/bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py b/bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py
index 9c376f09a4..bdb21b0ec2 100644
--- a/bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py
+++ b/bt5/erp5_hal_json_style/TestTemplateItem/portal_components/test.erp5.testHalJsonStyle.py
@@ -536,7 +536,8 @@ class TestERP5Document_getHateoas_mode_traverse(ERP5HALJSONStyleSkinsMixin):
       field_editable = 1,
       field_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date\ncatalog.uid|Uid',
       field_editable_columns = 'id|ID\ntitle|Title\nquantity|quantity\nstart_date|Date',
-      field_search_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',)
+      field_search_columns = 'id|ID\ntitle|Title\nquantity|Quantity\nstart_date|Date',
+      field_domain_root_list = 'foo_category|FooCat\nfoo_domain|FooDomain\nnot_existing_domain|NotExisting',)
 
     parent = document.getParentValue()
     fake_request = do_fake_request("GET")
@@ -630,6 +631,9 @@ class TestERP5Document_getHateoas_mode_traverse(ERP5HALJSONStyleSkinsMixin):
     self.assertEqual(result_dict['_embedded']['_view']['listbox']['sort_column_list'], [['id', 'ID'], ['title', 'Title'], ['quantity', 'Quantity'], ['start_date', 'Date']])
     self.assertEqual(result_dict['_embedded']['_view']['listbox']['list_method_template'],
                      '%s/web_site_module/hateoas/ERP5Document_getHateoas?mode=search&relative_url=foo_module%%2F%s&form_relative_url=portal_skins/erp5_ui_test/Foo_view/listbox&list_method=objectValues&default_param_json=eyJwb3J0YWxfdHlwZSI6IFsiRm9vIExpbmUiXSwgImlnbm9yZV91bmtub3duX2NvbHVtbnMiOiB0cnVlfQ=={&query,select_list*,limit*,sort_on*,local_roles*,selection_domain*}' % (self.portal.absolute_url(), document.getId()))
+    self.assertEqual(result_dict['_embedded']['_view']['listbox']['domain_root_list'], [['foo_category', 'FooCat'], ['foo_domain', 'FooDomain'], ['not_existing_domain', 'NotExisting']])
+    NBSP_prefix = u'\xA0' * 4
+    self.assertEqual(result_dict['_embedded']['_view']['listbox']['domain_dict'], {'foo_domain': [['a', 'a'], ['%sa1' % NBSP_prefix, 'a/a1'], ['%sa2' % NBSP_prefix, 'a/a2'], ['b', 'b']], 'foo_category': [['a', 'a'], ['a/a1', 'a/a1'], ['a/a2', 'a/a2'], ['b', 'b']]})
 
     self.assertEqual(result_dict['_embedded']['_view']['_links']['traversed_document']['href'], 'urn:jio:get:%s' % document.getRelativeUrl())
     self.assertEqual(result_dict['_embedded']['_view']['_links']['traversed_document']['name'], document.getRelativeUrl())
-- 
2.30.9