def save_watched_instance(elem, ar, watcher): if watcher.is_dirty(): pre_ui_save.send(sender=elem.__class__, instance=elem, ar=ar) elem.before_ui_save(ar) elem.save(force_update=True) watcher.send_update(ar) ar.success(_("%s has been updated.") % obj2unicode(elem)) else: ar.success(_("%s : nothing to save.") % obj2unicode(elem)) elem.after_ui_save(ar, watcher)
def save_new_instance(self, ar, elem): pre_ui_save.send(sender=elem.__class__, instance=elem, ar=ar) elem.before_ui_save(ar) elem.save(force_insert=True) # yes, `on_ui_created` comes *after* save() on_ui_created.send(elem, request=ar.request) elem.after_ui_create(ar) elem.after_ui_save(ar, None) ar.success(_("%s has been created.") % obj2unicode(elem)) if ar.actor.handle_uploaded_files is None: # The `rows` can contain complex strings which cause # decoding problems on the client when responding to a # file upload ar.set_response(rows=[ar.ah.store.row2list(ar, elem)]) else: # Must set text/html for file uploads, otherwise the # browser adds a <PRE></PRE> tag around the AJAX response. ar.set_content_type('text/html') if ar.actor.stay_in_grid: return # No need to ask refresh_all since closing the window will # automatically refresh the underlying window. ar.goto_instance(elem)
def delete_element(ar, elem): if elem is None: raise Warning("Cannot delete None") msg = ar.actor.disable_delete(elem, ar) if msg is not None: ar.error(None, msg, alert=True) return settings.SITE.kernel.default_renderer.render_action_response(ar) # ~ dblogger.log_deleted(ar.request,elem) # ~ changes.log_delete(ar.request,elem) pre_ui_delete.send(sender=elem, request=ar.request) try: elem.delete() except Exception as e: dblogger.exception(e) msg = _("Failed to delete %(record)s : %(error)s.") % dict( record=obj2unicode(elem), error=e) # ~ msg = "Failed to delete %s." % element_name(elem) ar.error(None, msg) return settings.SITE.kernel.default_renderer.render_action_response(ar) # ~ raise Http404(msg) return HttpResponseDeleted()
def delete_element(ar, elem): if elem is None: raise Warning("Cannot delete None") msg = ar.actor.disable_delete(elem, ar) if msg is not None: ar.error(None, msg, alert=True) return settings.SITE.kernel.default_renderer.render_action_response(ar) # ~ dblogger.log_deleted(ar.request,elem) # ~ changes.log_delete(ar.request,elem) pre_ui_delete.send(sender=elem, request=ar.request) try: elem.delete() except Exception as e: dblogger.exception(e) msg = _("Failed to delete %(record)s : %(error)s." ) % dict(record=obj2unicode(elem), error=e) # ~ msg = "Failed to delete %s." % element_name(elem) ar.error(None, msg) return settings.SITE.kernel.default_renderer.render_action_response(ar) # ~ raise Http404(msg) return HttpResponseDeleted()
def save_new_instance(self, ar, elem): pre_ui_save.send(sender=elem.__class__, instance=elem, ar=ar) elem.before_ui_save(ar) elem.save(force_insert=True) # yes, `on_ui_created` comes *after* save() on_ui_created.send(elem, request=ar.request) # elem.after_ui_create(ar) elem.after_ui_save(ar, None) ar.success(_("%s has been created.") % obj2unicode(elem)) if ar.actor.handle_uploaded_files is None: # The `rows` can contain complex strings which cause # decoding problems on the client when responding to a # file upload ar.set_response(rows=[ar.ah.store.row2list(ar, elem)]) else: # Must set text/html for file uploads, otherwise the # browser adds a <PRE></PRE> tag around the AJAX response. ar.set_content_type('text/html') # if ar.actor.stay_in_grid and ar.requesting_panel: if ar.actor.stay_in_grid: # do not open a detail window on the new instance return ar.goto_instance(elem)
def save_existing_instance(self, elem, ar): watcher = ChangeWatcher(elem) ar.ah.store.form2obj(ar, ar.rqdata, elem, False) elem.full_clean() if watcher.is_dirty(): pre_ui_save.send(sender=elem.__class__, instance=elem, ar=ar) elem.before_ui_save(ar) elem.save(force_update=True) watcher.send_update(ar.request) ar.success(_("%s has been updated.") % obj2unicode(elem)) else: ar.success(_("%s : nothing to save.") % obj2unicode(elem)) elem.after_ui_save(ar, watcher) # TODO: in fact we need *either* `rows` (when this was called # from a Grid) *or* `goto_instance` (when this was called from a # form). But how to find out which one is needed? # if ar.edit_mode == constants.EDIT_MODE_GRID: ar.set_response(rows=[ar.ah.store.row2list(ar, elem)])
def form2obj_and_save(ar, data, elem, is_new): """ Parses the data from HttpRequest to the model instance and saves it. This is used by `ApiList.post` and `ApiElement.put`, and by `Restful.post` and `Restful.put`. 20140505 : no longer used by ApiList and ApiElement, but still by Restful.* """ if is_new: watcher = None else: watcher = ChangeWatcher(elem) ar.ah.store.form2obj(ar, data, elem, is_new) elem.full_clean() if is_new or watcher.is_dirty(): pre_ui_save.send(sender=elem.__class__, instance=elem, ar=ar) elem.before_ui_save(ar) kw2save = {} if is_new: kw2save.update(force_insert=True) else: kw2save.update(force_update=True) elem.save(**kw2save) if is_new: on_ui_created.send(elem, request=ar.request) ar.success(_("%s has been created.") % obj2unicode(elem)) else: watcher.send_update(ar) ar.success(_("%s has been updated.") % obj2unicode(elem)) else: ar.success(_("%s : nothing to save.") % obj2unicode(elem)) elem.after_ui_save(ar, watcher)
def form2obj_and_save(ar, data, elem, is_new): """Parses the data from HttpRequest to the model instance and saves it This is used by `ApiList.post` and `ApiElement.put`, and by `Restful.post` and `Restful.put`. 20140505 : no longer used by ApiList and ApiElement, but still by Restful.* """ if is_new: watcher = None else: watcher = ChangeWatcher(elem) ar.ah.store.form2obj(ar, data, elem, is_new) elem.full_clean() if is_new or watcher.is_dirty(): pre_ui_save.send(sender=elem.__class__, instance=elem, ar=ar) elem.before_ui_save(ar) kw2save = {} if is_new: kw2save.update(force_insert=True) else: kw2save.update(force_update=True) elem.save(**kw2save) if is_new: on_ui_created.send(elem, request=ar.request) ar.success(_("%s has been created.") % obj2unicode(elem)) else: watcher.send_update(ar.request) ar.success(_("%s has been updated.") % obj2unicode(elem)) else: ar.success(_("%s : nothing to save.") % obj2unicode(elem)) elem.after_ui_save(ar, watcher)
def save_new_instance(self, ar, elem): elem.save_new_instance(ar) ar.success(_("%s has been created.") % obj2unicode(elem)) # print(19062017, "Ticket 1910") if ar.actor.handle_uploaded_files is None: # The `rows` can contain complex strings which cause # decoding problems on the client when responding to a # file upload ar.set_response(rows=[ar.ah.store.row2list(ar, elem)]) ar.set_response(navinfo=navinfo(ar.data_iterator, elem)) else: # Must set text/html for file uploads, otherwise the # browser adds a <PRE></PRE> tag around the AJAX response. ar.set_content_type('text/html') # if ar.actor.stay_in_grid and ar.requesting_panel: if ar.actor.stay_in_grid: # do not open a detail window on the new instance return ar.goto_instance(elem)