RGA(Open ERP) has proposed merging lp:~openerp-dev/openobject-client/list_view_fixes into lp:~openerp-dev/openobject-client/trunk-dev-client.
Requested reviews: OpenERP sa GTK client R&D (openerp-dev-gtk) Following bugs are fixed by this branch * Switch to graph does not work in group_by views * In One2many list editable, the last column was prefilled instead of empty when clicking enter. -- https://code.launchpad.net/~openerp-dev/openobject-client/list_view_fixes/+merge/28623 Your team OpenERP sa GTK client R&D is requested to review the proposed merge of lp:~openerp-dev/openobject-client/list_view_fixes into lp:~openerp-dev/openobject-client/trunk-dev-client.
=== modified file 'bin/po/ja.po' --- bin/po/ja.po 2010-06-09 03:35:14 +0000 +++ bin/po/ja.po 2010-06-28 11:25:45 +0000 @@ -8,13 +8,13 @@ "Project-Id-Version: openobject-client\n" "Report-Msgid-Bugs-To: FULL NAME <em...@address>\n" "POT-Creation-Date: 2009-11-25 02:00+0530\n" -"PO-Revision-Date: 2010-06-08 04:08+0000\n" +"PO-Revision-Date: 2010-06-20 03:54+0000\n" "Last-Translator: OpenERP Administrators <Unknown>\n" "Language-Team: Japanese <[email protected]>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2010-06-09 03:35+0000\n" +"X-Launchpad-Export-Date: 2010-06-21 03:42+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bin/plugins/__init__.py:29 === modified file 'bin/po/mn.po' --- bin/po/mn.po 2009-12-02 04:54:27 +0000 +++ bin/po/mn.po 2010-06-28 11:25:45 +0000 @@ -8,13 +8,13 @@ "Project-Id-Version: openobject-client\n" "Report-Msgid-Bugs-To: FULL NAME <em...@address>\n" "POT-Creation-Date: 2009-11-25 02:00+0530\n" -"PO-Revision-Date: 2009-12-01 05:48+0000\n" -"Last-Translator: Munkhbayar Batkhuu <[email protected]>\n" +"PO-Revision-Date: 2010-06-16 04:09+0000\n" +"Last-Translator: oogii <[email protected]>\n" "Language-Team: Mongolian <[email protected]>\n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"X-Launchpad-Export-Date: 2009-12-02 04:54+0000\n" +"X-Launchpad-Export-Date: 2010-06-17 03:33+0000\n" "X-Generator: Launchpad (build Unknown)\n" #: bin/plugins/__init__.py:28 @@ -1789,7 +1789,7 @@ #: bin/openerp.glade:5130 msgid "New" -msgstr "" +msgstr "ШинÑ" #: bin/openerp.glade:5145 msgid "<Ctrl> + N" @@ -1985,7 +1985,7 @@ #: bin/openerp.glade:6715 msgid "New database name:" -msgstr "" +msgstr "Ð¨Ð¸Ð½Ñ Ð´Ð°ÑабаазÑн нÑÑ:" #: bin/openerp.glade:6815 bin/openerp.glade:6961 bin/openerp.glade:7460 msgid "http://localhost:8069" @@ -1993,7 +1993,7 @@ #: bin/openerp.glade:6889 msgid "Create a new database" -msgstr "" +msgstr "Ð¨Ð¸Ð½Ñ Ð´Ð°Ñабааз Ò¯Ò¯ÑгÑÑ " #: bin/openerp.glade:6902 msgid "<b>Create a new database</b>" @@ -2028,7 +2028,7 @@ #: bin/openerp.glade:7110 msgid "New Database Name:" -msgstr "" +msgstr "Ð¨Ð¸Ð½Ñ ÐаÑабаазÑн ÐÑÑ" #: bin/openerp.glade:7134 msgid "" === modified file 'bin/widget/model/record.py' --- bin/widget/model/record.py 2010-05-11 05:50:42 +0000 +++ bin/widget/model/record.py 2010-06-28 11:25:45 +0000 @@ -206,10 +206,12 @@ return value def set_default(self, val): - for fieldname, value in val.items(): + a = val.items() + for fieldname, value in a: #val.items(): if fieldname not in self.mgroup.mfields: continue self.mgroup.mfields[fieldname].set_default(self, value) + self.mgroup.mfields[fieldname].set_default(self, value) self._loaded = True self.signal('record-changed') @@ -280,7 +282,7 @@ if not match: raise Exception, 'ERROR: Wrong on_change trigger: %s' % callback func_name = match.group(1) - arg_names = [n.strip() for n in match.group(2).split(',')] + arg_names = [n.strip() for n in match.group(2).split(',') if n.strip()] args = [self.expr_eval(arg) for arg in arg_names] ids = self.id and [self.id] or [] response = getattr(self.rpc, func_name)(ids, *args) @@ -300,13 +302,14 @@ self.signal('attrs-changed') def cond_default(self, field, value): - ir = RPCProxy('ir.values') - values = ir.get('default', '%s=%s' % (field, value), - [(self.resource, False)], False, {}) - data = {} - for index, fname, value in values: - data[fname] = value - self.set_default(data) + pass + #ir = RPCProxy('ir.values') + #values = ir.get('default', '%s=%s' % (field, value), + # [(self.resource, False)], False, {}) + #data = {} + #for index, fname, value in values: + # data[fname] = value + #self.set_default(data) # Performing button clicks on both forms of view: list and form. def get_button_action(self, screen, id=None, attrs={}): === modified file 'bin/widget/screen/screen.py' --- bin/widget/screen/screen.py 2010-06-24 06:37:47 +0000 +++ bin/widget/screen/screen.py 2010-06-28 11:25:45 +0000 @@ -229,7 +229,12 @@ self.auto_search = True return val = self.filter_widget and self.filter_widget.value or {} - self.context_update(val.get('context',{}), val.get('domain',[]) + self.sort_domain) + if self.current_view.view_type == 'graph': + self.domain = self.domain_init[:] + self.domain += val.get('domain',[]) + self.sort_domain + else: + self.context_update(val.get('context',{}), val.get('domain',[]) + self.sort_domain) + v = self.domain limit=self.screen_container.get_limit() if self.current_view.view_type == 'calendar': @@ -248,7 +253,7 @@ self.offset = 0 offset=self.offset self.latest_search = v - if self.context.get('group_by',False): + if self.context.get('group_by',False) and not self.current_view.view_type == 'graph': self.current_view.reload = True self.display() return True @@ -421,7 +426,7 @@ # mode: False = next view, value = open this view def switch_view(self, screen=None, mode=False): - if isinstance(self.current_model,group_record): + if isinstance(self.current_model, group_record) and mode != 'graph': return self.current_view.set_value() self.fields = {} === modified file 'bin/widget/view/form_gtk/calendar.py' --- bin/widget/view/form_gtk/calendar.py 2010-06-02 07:10:21 +0000 +++ bin/widget/view/form_gtk/calendar.py 2010-06-28 11:25:45 +0000 @@ -301,6 +301,8 @@ self.format = '%H:%M:%S' self.widget = date_widget.ComplexEntry(self.format, spacing=3) self.entry = self.widget.widget + self.entry.connect('focus-in-event', lambda x,y: self._focus_in()) + self.entry.connect('focus-out-event', lambda x,y: self._focus_out()) self.value=False def _readonly_set(self, value): === modified file 'bin/widget/view/graph_gtk/graph.py' --- bin/widget/view/graph_gtk/graph.py 2010-04-26 14:05:54 +0000 +++ bin/widget/view/graph_gtk/graph.py 2010-06-28 11:25:45 +0000 @@ -71,6 +71,7 @@ self.axis = axis self.old_axis = axis self.editable = False + self.key = False self.widget.editable = False self.axis_data = axis_data self.axis_group = {} @@ -86,9 +87,15 @@ self.axis = copy.copy(self.old_axis) group_by = self.widget.screen.context.get('group_by', False) if group_by: - models = models.models or models.list_group.lst + if not self.key: + del self.widget.screen.context['group_by'] + self.widget.screen.search_filter() + models = self.widget.screen.models + self.key = True + self.widget.screen.context['group_by'] = group_by self.axis[0] = group_by[0] self.axis_data[group_by[0]] = {} + for m in models: res = {} for x in self.axis_data.keys(): @@ -96,10 +103,7 @@ if self.fields[x]['type'] in ('many2one', 'char','time','text'): res[x] = field_val and str(field_val) or 'Undefined' elif self.fields[x]['type'] == 'selection': - if group_by and isinstance(m, group_record): - selection = dict(m.children[0][x].attrs['selection']) - else: - selection = dict(m[x].attrs['selection']) + selection = dict(m[x].attrs['selection']) if field_val: val = str(field_val) res[x] = selection.get(val, val) === modified file 'bin/widget/view/list.py' --- bin/widget/view/list.py 2010-04-26 09:39:39 +0000 +++ bin/widget/view/list.py 2010-06-28 11:25:45 +0000 @@ -695,10 +695,11 @@ if isinstance(renderer, gtk.CellRendererToggle): renderer.set_property('activatable', value) elif not isinstance(renderer, gtk.CellRendererProgress) and not isinstance(renderer, gtk.CellRendererPixbuf): - renderer.set_property('editable', value) + old_value = renderer.get_property('editable') + renderer.set_property('editable', value and old_value) if value in ('top','bottom'): if isinstance(renderer, (gtk.CellRendererText, gtk.CellRendererCombo, date_renderer.DecoratorRenderer)): - renderer.set_property('editable', value) + renderer.set_property('editable', value and old_value) if value: if self.widget_tree.handlers.has_key(col): if self.widget_tree.handlers[col]: === modified file 'bin/widget/view/tree_gtk/editabletree.py' --- bin/widget/view/tree_gtk/editabletree.py 2010-04-21 15:19:27 +0000 +++ bin/widget/view/tree_gtk/editabletree.py 2010-06-28 11:25:45 +0000 @@ -45,7 +45,6 @@ # The value has not changed ... do nothing. if value == cell.get_textual_value(current_model): return - try: real_value = cell.value_from_text(current_model, value) modelfield.set_client(current_model, real_value) @@ -187,7 +186,7 @@ txt = entry.get_active_text() entry.disconnect(entry.editing_done_id) self.on_quit_cell(model, column.name, txt) - entry.editing_done_id = entry.connect('editing_done', self.on_editing_done) + entry.editing_done_id = entry.connect('editing_done', self.on_editing_done, model, txt) if event.keyval in self.leaving_model_events: if model.validate() and self.screen.tree_saves: id = model.save() @@ -204,7 +203,7 @@ if col.name in invalid_fields: break self.set_cursor(path, col, True) - msg = _('Warning; field %s is required!') % ('<b>%s</b>' % invalid_fields[col.name]) + msg = _('Warning; field %s is required!') % ('<b>%s</b>' % invalid_fields[col.name]) self.warn('misc-message', msg, "red") return True @@ -217,12 +216,12 @@ elif event.keyval == gtk.keysyms.Up: self._key_up(path, store, column) elif event.keyval == gtk.keysyms.Down: - self._key_down(path,store,column) + self._key_down(path, store, column) elif event.keyval in (gtk.keysyms.Return, gtk.keysyms.KP_Enter): if self.editable == 'top': new_path = self._key_up(path, store, column) else: - new_path = self._key_down(path,store,column) + new_path = self._key_down(path, store, column) col = self.get_columns(False, False)[0] self.set_cursor(new_path, col, True) elif event.keyval == gtk.keysyms.Escape: @@ -277,16 +276,21 @@ self.set_cursor(new_path, column, True) return new_path - def on_editing_done(self, entry): + def on_editing_done(self, entry, model=None, txt=""): path, column = self.get_cursor() if not path: return True - store = self.get_model() - model = store.get_value(store.get_iter(path), 0) + if not model: + store = self.get_model() + model = store.get_value(store.get_iter(path), 0) + if isinstance(entry, gtk.Entry): + txt = entry.get_text() + elif isinstance(entry, gtk.ComboBoxEntry): + txt = entry.get_active_text() if isinstance(entry, gtk.Entry): - self.on_quit_cell(model, column.name, entry.get_text()) + self.on_quit_cell(model, column.name, txt) elif isinstance(entry, gtk.ComboBoxEntry): - self.on_quit_cell(model, column.name, entry.get_active_text()) + self.on_quit_cell(model, column.name, txt) # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: === modified file 'bin/widget_search/char.py' --- bin/widget_search/char.py 2010-05-26 07:12:35 +0000 +++ bin/widget_search/char.py 2010-06-28 11:25:45 +0000 @@ -23,7 +23,7 @@ import rpc import wid_int import tools - +import common class char(wid_int.wid_int): def __init__(self, name, parent, attrs={}, screen=None): @@ -34,7 +34,15 @@ self.widget.set_width_chars(15) self.widget.set_property('activates_default', True) if self.default_search: - self.widget.set_text(str(self.default_search) or '') + model = self.attrs.get('relation', '') + if attrs.get('type','') == 'many2one' and model: + try: + value = rpc.session.rpc_exec_auth('/object', 'execute', model, 'name_get', self.default_search) + except rpc.rpc_exception, e: + common.error(_('Error: ')+str(e.type), e.message, e.data) + value = [] + self.default_search = value and value[0] and value[0][1] or '' + self.widget.set_text(self.default_search or '') def _value_get(self): s = self.widget.get_text()
_______________________________________________ Mailing list: https://launchpad.net/~openerp-dev-gtk Post to : [email protected] Unsubscribe : https://launchpad.net/~openerp-dev-gtk More help : https://help.launchpad.net/ListHelp

