Reviewers: ,
Please review this at http://codereview.tryton.org/389003/
Affected files:
M CHANGELOG
M tryton/gui/window/view_form/view/form_gtk/many2many.py
M tryton/gui/window/view_form/view/form_gtk/many2one.py
M tryton/gui/window/view_form/view/form_gtk/one2many.py
M tryton/gui/window/view_form/view/form_gtk/parser.py
M tryton/gui/window/win_search.py
Index: CHANGELOG
===================================================================
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,3 +1,4 @@
+* Manage create/delete field access
* Search only on fields in XML view
* Cache action keyword
* Always use cached views
Index: tryton/gui/window/view_form/view/form_gtk/many2many.py
===================================================================
--- a/tryton/gui/window/view_form/view/form_gtk/many2many.py
+++ b/tryton/gui/window/view_form/view/form_gtk/many2many.py
@@ -150,7 +150,8 @@
WinSearch(self.attrs['relation'], callback, sel_multi=True,
ids=ids, context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
- views_preload=self.attrs.get('views', {}))
+ views_preload=self.attrs.get('views', {}),
+ new=self.attrs.get('create', True))
else:
callback([(i, None) for i in ids])
Index: tryton/gui/window/view_form/view/form_gtk/many2one.py
===================================================================
--- a/tryton/gui/window/view_form/view/form_gtk/many2one.py
+++ b/tryton/gui/window/view_form/view/form_gtk/many2one.py
@@ -76,7 +76,8 @@
def _readonly_set(self, value):
self._readonly = value
self.wid_text.set_editable(not value)
- self.but_new.set_sensitive(not value)
+ self.but_new.set_sensitive(not value
+ and self.attrs.get('create', True))
if value:
self.widget.set_focus_chain([])
else:
@@ -160,7 +161,8 @@
WinSearch(model, callback, sel_multi=False,
ids=ids, context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
- views_preload=self.attrs.get('views', {}))
+ views_preload=self.attrs.get('views', {}),
+ new=self.but_new.get_property('sensitive'))
return
self.focus_out = True
self.display(self.record, self.field)
@@ -249,7 +251,8 @@
WinSearch(model, callback, sel_multi=False,
ids=ids, context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
- views_preload=self.attrs.get('views', {}))
+ views_preload=self.attrs.get('views', {}),
+ new=self.but_new.get_property('sensitive'))
return
self.focus_out = True
self.display(self.record, self.field)
@@ -258,10 +261,13 @@
def sig_key_press(self, widget, event, *args):
editable = self.wid_text.get_editable()
- if event.keyval == gtk.keysyms.F3 and editable:
+ if (event.keyval == gtk.keysyms.F3
+ and editable
+ and self.but_new.get_property('sensitive')):
self.sig_new(widget, event)
return True
- elif event.keyval == gtk.keysyms.F2:
+ elif (event.keyval == gtk.keysyms.F2
+ and self.but_open.get_property('sensitive')):
self.sig_edit(widget)
return True
elif (event.keyval in (gtk.keysyms.Tab, gtk.keysyms.Return)
@@ -297,7 +303,7 @@
model = self.get_model()
if model:
access = common.MODELACCESS[model]
- if not access['create']:
+ if not access['create'] or not self.attrs.get('create', True):
self.but_new.set_sensitive(False)
if not access['read']:
self.but_open.set_sensitive(False)
Index: tryton/gui/window/view_form/view/form_gtk/one2many.py
===================================================================
--- a/tryton/gui/window/view_form/view/form_gtk/one2many.py
+++ b/tryton/gui/window/view_form/view/form_gtk/one2many.py
@@ -186,8 +186,9 @@
and widget == self.screen.widget:
self._sig_edit(widget)
return False
- if event.keyval in (gtk.keysyms.Delete, gtk.keysyms.KP_Delete) \
- and widget == self.screen.widget:
+ if (event.keyval in (gtk.keysyms.Delete, gtk.keysyms.KP_Delete)
+ and widget == self.screen.widget
+ and self.but_del.get_property('sensitive')):
self._sig_remove(widget)
return False
if event.keyval == gtk.keysyms.Insert and widget ==
self.screen.widget:
@@ -219,8 +220,10 @@
def _readonly_set(self, value):
self._readonly = value
- self.but_new.set_sensitive(not value)
- self.but_del.set_sensitive(not value)
+ self.but_new.set_sensitive(not value
+ and self.attrs.get('create', True))
+ self.but_del.set_sensitive(not value
+ and self.attrs.get('delete', True))
self.but_undel.set_sensitive(not value)
if self.attrs.get('add_remove'):
self.wid_text.set_sensitive(not value)
@@ -343,7 +346,8 @@
WinSearch(self.attrs['relation'], callback, sel_multi=True,
ids=ids, context=context, domain=domain,
view_ids=self.attrs.get('view_ids', '').split(','),
- views_preload=self.attrs.get('views', {}))
+ views_preload=self.attrs.get('views', {}),
+ new=self.but_new.get_property('sensitive'))
else:
callback([(i, None) for i in ids])
@@ -352,7 +356,8 @@
if signal_data[0] >= 1:
name = str(signal_data[0])
self.but_open.set_sensitive(True)
- self.but_del.set_sensitive(not self._readonly)
+ self.but_del.set_sensitive(not self._readonly
+ and self.attrs.get('delete', True))
if self.attrs.get('add_remove'):
self.but_remove.set_sensitive(not self._readonly)
if signal_data[0] < signal_data[1]:
@@ -363,7 +368,6 @@
self.but_pre.set_sensitive(True)
else:
self.but_pre.set_sensitive(False)
- self.but_del.set_sensitive(not self._readonly)
self.but_undel.set_sensitive(not self._readonly)
else:
self.but_open.set_sensitive(False)
@@ -380,7 +384,7 @@
super(One2Many, self).display(record, field)
access = common.MODELACCESS[self.screen.model_name]
- if not access['create']:
+ if not access['create'] or not self.attrs.get('create', True):
self.but_new.set_sensitive(False)
if not access['write'] or not access['read']:
if hasattr(self, 'but_add'):
@@ -389,7 +393,7 @@
self.but_remove.set_sensitive(False)
if not access['read']:
self.but_open.set_sensitive(False)
- if not access['delete']:
+ if not access['delete'] or not self.attrs.get('delete', True):
self.but_del.set_sensitive(False)
if field is None:
Index: tryton/gui/window/view_form/view/form_gtk/parser.py
===================================================================
--- a/tryton/gui/window/view_form/view/form_gtk/parser.py
+++ b/tryton/gui/window/view_form/view/form_gtk/parser.py
@@ -439,7 +439,7 @@
for attr_name in ('relation', 'domain', 'selection',
'relation_field', 'string', 'views', 'invisible',
'add_remove', 'sort', 'context', 'size', 'filename',
- 'autocomplete', 'translate'):
+ 'autocomplete', 'translate', 'create', 'delete'):
if attr_name in fields[name].attrs and \
not attr_name in attrs:
attrs[attr_name] = fields[name].attrs[attr_name]
Index: tryton/gui/window/win_search.py
===================================================================
--- a/tryton/gui/window/win_search.py
+++ b/tryton/gui/window/win_search.py
@@ -14,7 +14,7 @@
class WinSearch(NoModal):
def __init__(self, model, callback, sel_multi=True, ids=None,
context=None,
- domain=None, view_ids=None, views_preload=None):
+ domain=None, view_ids=None, views_preload=None, new=True):
NoModal.__init__(self)
if views_preload is None:
views_preload = {}
@@ -39,7 +39,9 @@
self.but_ok = self.win.add_button(gtk.STOCK_OK, gtk.RESPONSE_OK)
self.but_ok.add_accelerator('clicked', self.accel_group,
gtk.keysyms.Return, gtk.gdk.CONTROL_MASK,
gtk.ACCEL_VISIBLE)
- self.but_new = self.win.add_button(gtk.STOCK_NEW,
gtk.RESPONSE_ACCEPT)
+ if new and common.MODELACCESS[model]['create']:
+ self.but_new = self.win.add_button(gtk.STOCK_NEW,
+ gtk.RESPONSE_ACCEPT)
hbox = gtk.HBox()
hbox.show()
--
[email protected] mailing list