Manage deletable and writable state from ir.rule

issue9357
review290101002
This commit is contained in:
Nicolas Évrard committed 2020-09-23 10:04:19 +02:00
1 parent 2baa5cd154
commit 85d760fa31
6 files changed
+55 -10

No files matched your search

+1
View File
@@ -1,3 +1,4 @@
* Manage deletable and writable state
* Support e-mail template
* Send e-mail via the server
* Support PYSON comparison of date and datetime
+12 -2
View File
@@ -302,7 +302,8 @@ class Form(SignalEvent, TabContent):
self.menu_buttons[name].props.sensitive = False
def sig_remove(self, widget=None):
if not common.MODELACCESS[self.model]['delete']:
if (not common.MODELACCESS[self.model]['delete']
or not self.screen.deletable):
return
if self.screen.current_view.view_type == 'form':
msg = _('Are you sure to remove this record?')
@@ -379,7 +380,8 @@ class Form(SignalEvent, TabContent):
# Called from button so we must save the tree state
self.screen.save_tree_state()
if not (common.MODELACCESS[self.model]['write']
or common.MODELACCESS[self.model]['create']):
or common.MODELACCESS[self.model]['create']
or self.screen.writable):
return
if self.screen.save_current():
self.message_info(_('Record saved.'), Gtk.MessageType.INFO)
@@ -423,6 +425,7 @@ class Form(SignalEvent, TabContent):
break
self.screen.display(set_cursor=set_cursor)
self.message_info()
self.set_buttons_sensitive()
self.activate_save()
self.screen.count_tab_domain()
return True
@@ -509,11 +512,18 @@ class Form(SignalEvent, TabContent):
can_be_sensitive |= any(
b.attrs.get('keyword', 'action') == action_type
for b in screen.get_buttons())
elif button_id == 'save':
can_be_sensitive &= not self.screen.readonly
button.props.sensitive = (bool(signal_data[0])
and can_be_sensitive)
button_switch = self.buttons['switch']
button_switch.props.sensitive = self.screen.number_of_views > 1
menu_delete = self.menu_buttons['remove']
menu_delete.props.sensitive = self.screen.deletable
menu_save = self.menu_buttons['save']
menu_save.props.sensitive = not self.screen.readonly
msg = name + ' / ' + str(signal_data[1])
if signal_data[1] < signal_data[2]:
msg += _(' of ') + str(signal_data[2])
+14 -2
View File
@@ -28,6 +28,8 @@ class Record(SignalEvent):
self.state_attrs = {}
self.modified_fields = {}
self._timestamp = None
self._write = True
self._delete = True
self.resources = None
self.button_clicks = {}
self.links_counts = {}
@@ -73,7 +75,7 @@ class Record(SignalEvent):
in ('many2one', 'one2one', 'reference')))
if 'rec_name' not in fnames:
fnames.append('rec_name')
fnames.append('_timestamp')
fnames.extend(['_timestamp', '_write', '_delete'])
record_context = self.get_context()
if loading == 'eager':
@@ -226,10 +228,17 @@ class Record(SignalEvent):
deleted = property(get_deleted)
def get_readonly(self):
return self.deleted or self.removed or self.exception
return (self.deleted
or self.removed
or self.exception
or not self._write)
readonly = property(get_readonly)
@property
def deletable(self):
return self._delete
def fields_get(self):
return self.group.fields
@@ -436,6 +445,9 @@ class Record(SignalEvent):
if not self._timestamp:
self._timestamp = value
continue
if fieldname in {'_write', '_delete'}:
setattr(self, fieldname, value)
continue
if fieldname not in self.group.fields:
if fieldname == 'rec_name':
self.value['rec_name'] = value
+18 -3
View File
@@ -142,6 +142,19 @@ class Screen(SignalEvent):
def __repr__(self):
return '<Screen %s at %s>' % (self.model_name, id(self))
@property
def readonly(self):
return (self.__readonly
or any(r.readonly for r in self.selected_records))
@readonly.setter
def readonly(self, value):
self.__readonly = value
@property
def deletable(self):
return all(r.deletable for r in self.selected_records)
def search_active(self, active=True):
if active and not self.parent:
self.screen_container.set_screen(self)
@@ -413,7 +426,7 @@ class Screen(SignalEvent):
def new_group(self, context=None):
context = context if context is not None else self.context
self.group = Group(self.model_name, {}, domain=self.domain,
context=context, readonly=self.readonly)
context=context, readonly=self.__readonly)
def _group_cleared(self, group, signal):
for view in self.views:
@@ -1104,7 +1117,7 @@ class Screen(SignalEvent):
@property
def selected_records(self):
return self.current_view.selected_records
return self.current_view.selected_records if self.current_view else []
def clear(self):
self.current_record = None
@@ -1196,7 +1209,9 @@ class Screen(SignalEvent):
if access['create']:
self.new()
elif action == 'delete':
if access['delete']:
if (access['delete']
and (self.current_record.deletable
if self.current_record else True)):
self.remove(delete=not self.parent,
force_remove=not self.parent)
elif action == 'remove':
@@ -268,6 +268,7 @@ class One2Many(Widget):
if isinstance(self._position, int):
first = self._position <= 1
last = self._position >= self._length
deletable = self.screen.deletable
self.but_new.set_sensitive(bool(
not self._readonly
@@ -277,6 +278,7 @@ class One2Many(Widget):
self.but_del.set_sensitive(bool(
not self._readonly
and self.attrs.get('delete', True)
and deletable
and self._position
and access['delete']))
self.but_undel.set_sensitive(bool(
@@ -427,11 +429,13 @@ class One2Many(Widget):
def _sig_remove(self, widget, remove=False):
access = common.MODELACCESS[self.screen.model_name]
writable = not self.screen.readonly
deletable = self.screen.deletable
if remove:
if not access['write'] or not access['read']:
if not access['write'] or not writable or not access['read']:
return
else:
if not access['delete']:
if not access['delete'] or not deletable:
return
self.screen.remove(remove=remove)
+4 -1
View File
@@ -322,6 +322,9 @@ class WinForm(NoModal, InfoBar):
def _sig_label(self, screen, signal_data):
name = '_'
access = common.MODELACCESS[screen.model_name]
deletable = True
if screen.current_record:
deletable = screen.current_record.deletable
readonly = screen.group.readonly
if signal_data[0] >= 1:
name = str(signal_data[0])
@@ -335,7 +338,7 @@ class WinForm(NoModal, InfoBar):
self.but_pre.set_sensitive(True)
else:
self.but_pre.set_sensitive(False)
if access['delete'] and not readonly:
if access['delete'] and not readonly and deletable:
self.but_del.set_sensitive(True)
self.but_undel.set_sensitive(True)
else: