def run_from_code(self, ar, **known_values): obj = ar.selected_rows[0] related = [] for m, fk in obj._lino_ddh.fklist: if fk.name in m.allow_cascaded_delete: related.append((fk, m.objects.filter(**{fk.name: obj}))) if AFTER17: fields_list = obj._meta.concrete_fields else: fields_list = obj._meta.fields if True: for f in fields_list: if not f.primary_key: known_values[f.name] = getattr(obj, f.name) new = obj.__class__(**known_values) # 20120704 create_instances causes fill_from_person() on a # CBSS request. else: # doesn't seem to want to work new = obj for f in fields_list: if f.primary_key: # causes Django to consider this an unsaved instance setattr(new, f.name, None) new.save(force_insert=True) cw = ChangeWatcher(new) new.on_duplicate(ar, None) if cw.is_dirty(): new.full_clean() new.save() for fk, qs in related: for relobj in qs: relobj.pk = None # causes Django to save a copy setattr(relobj, fk.name, new) relobj.on_duplicate(ar, new) relobj.save(force_insert=True) return new
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.request) ar.success(_("%s has been updated.") % obj2unicode(elem)) else: ar.success(_("%s : nothing to save.") % obj2unicode(elem)) elem.after_ui_save(ar, watcher)