def __init__(self, model, **kw): fields = dict( #~ merge_from=models.ForeignKey(model,verbose_name=_("Merge...")), merge_to=models.ForeignKey(model, verbose_name=_("into..."), blank=False, null=False), reason=models.CharField(_("Reason"), max_length=100) #~ notify=models.BooleanField(_("Send notifications")) ) keep_volatiles = [] # logger.info("20160621 MergeAction for %s", model) # logger.info("20160621 MergeAction for %s : _lino_ddh.fklist is %s", # model, model._lino_ddh.fklist) for m, fk in traverse_ddh_fklist(model): if fk.name in m.allow_cascaded_delete: fieldname = full_model_name(m, '_') if fieldname not in keep_volatiles: keep_volatiles.append(fieldname) fields[fieldname] = models.BooleanField( m._meta.verbose_name_plural, default=False) # logger.info( # "20160621 %r in %r", fk.name, m.allow_cascaded_delete) layout = dict() if len(keep_volatiles) == 0: width = 50 main = """ merge_to reason """ else: COLCOUNT = 2 width = 70 if len(keep_volatiles) > COLCOUNT: tpl = '' for i, name in enumerate(keep_volatiles): if i % COLCOUNT == 0: tpl += '\n' else: tpl += ' ' tpl += name else: tpl = ' '.join(keep_volatiles) main = """ merge_to keep_volatiles reason """ layout.update(keep_volatiles=layouts.Panel( tpl, label=_("Also reassign volatile related objects"))) layout.update(window_size=(width, 'auto')) kw.update(parameters=fields, params_layout=layouts.Panel(main, **layout)) super(MergeAction, self).__init__(**kw)
class NotifyingAction(Action): """An action with a generic dialog window of three fields "Summary", "Description" and a checkbox "Don't send email notification". The default implementation calls the request's :meth:`add_system_note <lino.core.requests.BaseRequest.add_system_note>` method. Screenshot of a notifying action: .. image:: /images/screenshots/reception.CheckinVisitor.png :scale: 50 Dialog fields: .. attribute:: subject .. attribute:: body .. attribute:: silent """ custom_handler = True parameters = dict( notify_subject=models.CharField( _("Summary"), blank=True, max_length=200), notify_body=fields.RichTextField(_("Description"), blank=True), notify_silent=models.BooleanField( _("Don't send email notification"), default=False), ) params_layout = layouts.Panel(""" notify_subject notify_body notify_silent """, window_size=(50, 15)) def get_notify_subject(self, ar, obj): """ Return the default value of the `notify_subject` field. """ return None def get_notify_body(self, ar, obj): """ Return the default value of the `notify_body` field. """ return None def action_param_defaults(self, ar, obj, **kw): kw = super(NotifyingAction, self).action_param_defaults(ar, obj, **kw) if obj is not None: s = self.get_notify_subject(ar, obj) if s is not None: kw.update(notify_subject=s) s = self.get_notify_body(ar, obj) if s is not None: kw.update(notify_body=s) return kw def run_from_ui(self, ar, **kw): obj = ar.selected_rows[0] ar.set_response(message=ar.action_param_values.notify_subject) ar.set_response(refresh=True) ar.set_response(success=True) self.add_system_note(ar, obj) def add_system_note(self, ar, owner, **kw): #~ body = _("""%(user)s executed the following action:\n%(body)s #~ """) % dict(user=ar.get_user(),body=body) ar.add_system_note( owner, ar.action_param_values.notify_subject, ar.action_param_values.notify_body, ar.action_param_values.notify_silent, **kw)