From ff583b4fc75cf70f53b11655da94e33484771e2d Mon Sep 17 00:00:00 2001
From: Sebastien Robin <seb@nexedi.com>
Date: Wed, 14 Apr 2004 16:07:35 +0000
Subject: [PATCH] allows to use properties on temp objects

git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@672 20353a03-c40f-0410-a6d1-a30d3c3de9de
---
 product/ERP5Form/ListBox.py | 62 ++++++++++++++++++++++++++++++++++---
 1 file changed, 57 insertions(+), 5 deletions(-)

diff --git a/product/ERP5Form/ListBox.py b/product/ERP5Form/ListBox.py
index 2828a647b0..c9220bb07a 100755
--- a/product/ERP5Form/ListBox.py
+++ b/product/ERP5Form/ListBox.py
@@ -1178,19 +1178,71 @@ class ListBoxValidator(Validator.Validator):
         column_ids = map(lambda x: x[0], columns)
         editable_column_ids = map(lambda x: x[0], editable_columns)
         all_editable_column_ids = map(lambda x: x[0], all_editable_columns)
-
-        #LOG('In Listbox Validator',0,'')
+        selection_name = field.get_value('selection_name')
+        selection = here.portal_selections.getSelectionFor(selection_name, REQUEST=REQUEST)
 
         result = {}
         error_result = {}
         listbox_uids = REQUEST.get('%s_uid' % field.id, [])
+        #LOG('ListBox.validate: REQUEST',0,REQUEST)
         errors = []
-        LOG('ListBox.validate: listbox_uids',0,listbox_uids)
+        object_list = []
+        # We have two things to do in the case of temp objects,
+        # the first thing is to create a list with new temp objects
+        # then try to validate some data, and then create again
+        # the list with a listbox as parameter. Like this we
+        # can use tales expression
+        for uid in listbox_uids:
+          if str(uid).find('new') == 0:
+            list_method = field.get_value('list_method')
+            list_method = getattr(here, list_method.method_name)
+            object_list = list_method(REQUEST=REQUEST)
+            break
+        listbox = {}
+        for uid in listbox_uids:
+          if str(uid).find('new') == 0:
+            o = None
+            for object in object_list:
+              if object.getUid()==uid:
+                o = object
+            listbox[uid[4:]] = {}
+            # We first try to set a listbox corresponding to all things 
+            # we can validate, so that we can use the same list 
+            # as the one used for displaying the listbox
+            for sql in editable_column_ids:
+              alias = '_'.join(sql.split('.'))
+              if '.' in sql:
+                property_id = '.'.join(sql.split('.')[1:]) # Only take trailing part
+              else:
+                property_id = alias
+              my_field_id = '%s_%s' % (field.id, alias)
+              if form.has_field( my_field_id ):
+                my_field = form.get_field(my_field_id)
+                key = 'field_' + my_field.id + '_%s' % o.uid
+                error_result_key = my_field.id + '_%s' % o.uid
+                REQUEST.cell = o
+                try:
+                  value = my_field.validator.validate(my_field, key, REQUEST) # We need cell
+                  # Here we set the property
+                  listbox[uid[4:]][sql] = value
+                except ValidationError, err: # XXXX import missing
+                  pass
+        # Here we generate again the object_list with listbox the listbox we
+        # have just created
+        if len(listbox)>0:
+          list_method = field.get_value('list_method')
+          list_method = getattr(here, list_method.method_name)
+          REQUEST.set('listbox',listbox)
+          object_list = list_method(REQUEST=REQUEST)
         for uid in listbox_uids:
           if str(uid).find('new') == 0:
             # First case: dialog input to create new objects
-            o = newTempBase(here, uid[4:])
-            o.uid = uid
+            #o = newTempBase(here, uid[4:]) # Arghhh - XXX acquisition problem - use portal root
+            #o.uid = uid
+            o = None
+            for object in object_list:
+              if object.getUid()==uid:
+                o = object
             result[uid[4:]] = {}
             for sql in editable_column_ids:
               alias = '_'.join(sql.split('.'))
-- 
2.30.9