← Back to team overview

openerp-dev-web team mailing list archive

[Merge] lp:~openerp-dev/openobject-client/trunk-bug-720178-rga into lp:openobject-client

 

Ravi Gadhia (OpenERP) has proposed merging lp:~openerp-dev/openobject-client/trunk-bug-720178-rga into lp:openobject-client.

Requested reviews:
  Naresh(OpenERP) (nch-openerp)
  tfr (Openerp) (tfr)

For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-client/trunk-bug-720178-rga/+merge/55721

Hello tfr, nch
        I re-implement required field validation error message with field name. this branch fix all previous regression. 
-- 
https://code.launchpad.net/~openerp-dev/openobject-client/trunk-bug-720178-rga/+merge/55721
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-client/trunk-bug-720178-rga.
=== modified file 'bin/common/common.py'
--- bin/common/common.py	2011-03-28 09:11:21 +0000
+++ bin/common/common.py	2011-03-31 10:24:43 +0000
@@ -128,6 +128,41 @@
             self.help_frame.show_all()
             return True
         return False
+    
+def get_invalid_field(model, screen):
+    """
+    Return [('field_string','is_visible'), .. ]    
+    """
+    view_type = screen.current_view.view_type
+    if view_type == 'form':
+        fieldlist = {}
+        for widget in  screen.current_view.widgets.values():
+                fieldlist[widget.widget_name]= widget.widget.widget  
+    else:
+        columnlist = {}
+        for column in screen.current_view.columns:
+            columnlist[column.name] = column.get_property('visible')
+    fields = []
+    for field, attribute in model.state_attrs.items():
+        if not attribute.get('valid', False):
+            name = attribute.get('name', False)
+            visible = False
+            if view_type == 'form':
+                fname = fieldlist.get(name)
+                if name and fname:
+                    visible= fieldlist[name].flags() &  gtk.VISIBLE
+            else:
+                visible = columnlist[name]
+            fields.append((attribute['string'], bool(visible)))
+            if attribute['type'] == 'one2many' and view_type == 'form':
+                child_field =[]
+                screen = screen.current_view.widgets[name].widget.screen
+                for child_model in model.value[attribute['name']].models:
+                    child_field = get_invalid_field(child_model, screen)
+                for req, inv in child_field:
+                        req = '-- ' + req
+                        fields.append((req , inv))
+    return fields
 
 
 def OpenERP_Progressbar(parent=None, title=_('OpenERP Computing')):
@@ -499,13 +534,14 @@
     win.destroy()
     return True
 
-def message(msg, title=None, type=gtk.MESSAGE_INFO, parent=None):
+def message(msg, title=None, type=gtk.MESSAGE_INFO, parent=None, msg_to_xml=True):
     if not parent:
         parent=service.LocalService('gui.main').window
     dialog = gtk.MessageDialog(parent,
       gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
       type, gtk.BUTTONS_OK)
-    msg = to_xml(msg)
+    if msg_to_xml:
+        msg = to_xml(msg)
     if title is not None:
         msg = '<b>%s</b>\n\n%s' % (to_xml(title), msg)
     dialog.set_icon(OPENERP_ICON)
@@ -517,7 +553,6 @@
     return True
 
 def to_xml(s):
-    from cgi import escape
     return escape(s)
 
 def message_box(title, msg, parent=None):
@@ -543,8 +578,8 @@
     return True
 
 
-def warning(msg, title=None, parent=None):
-    return message(msg=msg, title=title, type=gtk.MESSAGE_WARNING, parent=parent)
+def warning(msg, title=None, parent=None, to_xml=True):
+    return message(msg=msg, title=title, type=gtk.MESSAGE_WARNING, parent=parent, msg_to_xml=to_xml)
 
 def sur(msg, parent=None):
     if not parent:

=== modified file 'bin/modules/gui/window/form.py'
--- bin/modules/gui/window/form.py	2011-03-28 09:11:21 +0000
+++ bin/modules/gui/window/form.py	2011-03-31 10:24:43 +0000
@@ -39,6 +39,7 @@
 import service
 import options
 import copy
+import tools
 
 
 from observator import oregistry
@@ -331,7 +332,15 @@
         if id:
             self.message_state(_('Document Saved.'), color="darkgreen")
         elif len(self.screen.models.models) and res != None:
-            common.warning(_('Invalid form, correct red fields !'),_('Error !'), parent=self.screen.current_view.window)
+            fields  = common.get_invalid_field(self.screen.current_model, self.screen)
+            msg = ''
+            for req, inv in fields:
+                if not inv:
+                    msg += req + ' (<b>invisible</b>) '
+                else:
+                    msg += req
+                msg += '\n'
+            common.warning(_('Correct following red fields !\n\n%s')  % ( msg ),_('Input Error !'), parent=self.screen.current_view.window, to_xml=False)
             self.message_state(_('Invalid form, correct red fields !'), color="red")
         if warning:
             common.warning(warning,_('Warning !'), parent=self.screen.current_view.window)

=== modified file 'bin/widget/view/form.py'
--- bin/widget/view/form.py	2011-02-25 12:29:22 +0000
+++ bin/widget/view/form.py	2011-03-31 10:24:43 +0000
@@ -358,14 +358,14 @@
             result = tools.calc_condition(self, model, v)
             if result:
                 if k=='invisible':
-                    obj.hide()
+                    obj.hide_all()
                 if k=='focus':
                     notebook.set_current_page(rank)
                 elif k=='readonly':
                     obj.set_sensitive(False)
             else:
                 if k=='invisible':
-                    obj.show()
+                    obj.show_all()
                 if k=='readonly':
                     obj.set_sensitive(True)
 

=== modified file 'bin/widget/view/form_gtk/interface.py'
--- bin/widget/view/form_gtk/interface.py	2010-12-13 15:45:20 +0000
+++ bin/widget/view/form_gtk/interface.py	2011-03-31 10:24:43 +0000
@@ -149,11 +149,12 @@
     def grab_focus(self):
         return self.widget.grab_focus()
 
-    def hide(self):
-        return self.widget.hide()
-
-    def show(self):
-        return self.widget.show()
+    def hide_all(self):
+        return self.widget.hide_all()
+
+    def show_all(self):
+        return self.widget.show_all()
+
 
     def set_sensitive(self, value):
         return self.widget.set_sensitive(value)

=== modified file 'bin/widget/view/form_gtk/parser.py'
--- bin/widget/view/form_gtk/parser.py	2011-03-28 09:11:21 +0000
+++ bin/widget/view/form_gtk/parser.py	2011-03-31 10:24:43 +0000
@@ -77,11 +77,11 @@
     def grab_focus(self):
         self.widget.grab_focus()
 
-    def hide(self):
-        return self.widget.hide()
-
-    def show(self):
-        return self.widget.show()
+    def hide_all(self):
+        return self.widget.hide_all()
+    
+    def show_all(self):
+        return self.widget.show_all()
 
     def set_sensitive(self, value):
         return self.widget.set_sensitive(value)
@@ -123,7 +123,15 @@
             model.get_button_action(self.form.screen, id, self.attrs)
             self.warn('misc-message', '')
         else:
-            common.warning(_('Invalid form, correct red fields !'), _('Error !'),parent=self.form.screen.current_view.window)
+            fields  = common.get_invalid_field(self.form.screen.current_model, self.form.screen)
+            msg = ''
+            for req, inv in fields:
+                if not inv:
+                    msg += req + ' (<b>invisible</b>) '
+                else:
+                    msg += req
+                msg += '\n'
+            common.warning(_('Correct following red fields !\n\n%s')  % ( msg ),_('Input Error !'), parent=self.form.screen.current_view.window, to_xml=False)
             self.warn('misc-message', _('Invalid form, correct red fields !'), "red")
             self.form.screen.display()
             self.form.screen.current_view.set_cursor()
@@ -142,9 +150,9 @@
 
     def state_set(self, state):
         if (not len(self.states)) or (state in self.states):
-            self.widget.show()
+            self.widget.show_all()
         else:
-            self.widget.hide()
+            self.widget.hide_all()
 
     def attrs_set(self, model):
         sa = getattr(self.widget, 'attrs') or {}
@@ -154,7 +162,7 @@
             result = True
             result = result and tools.calc_condition(self, model, v)
             if k == 'invisible':
-                func = ['show', 'hide'][bool(result)]
+                func = ['show_all', 'hide_all'][bool(result)]
                 getattr(self.widget, func)()
                 if self.label:
                     getattr(self.label, func)()


Follow ups