def get_bom_diff(bom1, bom2): from frappe.model import table_fields if bom1 == bom2: frappe.throw( _("BOM 1 {0} and BOM 2 {1} should not be same").format( frappe.bold(bom1), frappe.bold(bom2))) doc1 = frappe.get_doc('BOM', bom1) doc2 = frappe.get_doc('BOM', bom2) out = get_diff(doc1, doc2) out.row_changed = [] out.added = [] out.removed = [] meta = doc1.meta identifiers = { 'operations': 'operation', 'items': 'item_code', 'scrap_items': 'item_code', 'exploded_items': 'item_code' } for df in meta.fields: old_value, new_value = doc1.get(df.fieldname), doc2.get(df.fieldname) if df.fieldtype in table_fields: identifier = identifiers[df.fieldname] # make maps old_row_by_identifier, new_row_by_identifier = {}, {} for d in old_value: old_row_by_identifier[d.get(identifier)] = d for d in new_value: new_row_by_identifier[d.get(identifier)] = d # check rows for additions, changes for i, d in enumerate(new_value): if d.get(identifier) in old_row_by_identifier: diff = get_diff(old_row_by_identifier[d.get(identifier)], d, for_child=True) if diff and diff.changed: out.row_changed.append( (df.fieldname, i, d.get(identifier), diff.changed)) else: out.added.append([df.fieldname, d.as_dict()]) # check for deletions for d in old_value: if not d.get(identifier) in new_row_by_identifier: out.removed.append([df.fieldname, d.as_dict()]) return out
def on_update(self): if not self.is_new(): b, a = self.get_doc_before_save(), self diff = dictify(get_diff(a, b)) if diff: user = session.user fields = [changed[0] for changed in diff.changed] if 'status' in fields: rooms = chat_room.get( user, filters=['Chat Room', 'type', '=', 'Direct']) update = dict(user=user, data=dict(status=self.status)) for room in rooms: frappe.publish_realtime('frappe.chat.profile:update', update, room=room.name, after_commit=True) if 'enable_chat' in fields: update = dict( user=user, data=dict(enable_chat=bool(self.enable_chat))) frappe.publish_realtime('frappe.chat.profile:update', update, user=user, after_commit=True)
def on_update(self): if not self.is_new(): before = self.get_doc_before_save() if not before: return after = self diff = dictify(get_diff(before, after)) if diff: update = {} for changed in diff.changed: field, old, new = changed if field == 'last_message': new = chat_message.get(new) update.update({field: new}) if diff.added or diff.removed: update.update(dict(users=[u.user for u in self.users])) update = dict(room=self.name, data=update) frappe.publish_realtime('frappe.chat.room:update', update, room=self.name, after_commit=True)
def test_get_diff(self): test_records = make_test_objects('Event', reset = True) old_doc = frappe.get_doc("Event", test_records[0]) new_doc = copy.deepcopy(old_doc) old_doc.color = None diff = get_diff(old_doc, new_doc)['changed'] self.assertEquals(get_fieldnames(diff)[0], 'color') self.assertTrue(get_old_values(diff)[0] is None) self.assertEquals(get_new_values(diff)[0], 'blue') new_doc.starts_on = "2017-07-20" diff = get_diff(old_doc, new_doc)['changed'] self.assertEquals(get_fieldnames(diff)[0], 'starts_on') self.assertEquals(get_old_values(diff)[0], '01-01-2014 00:00:00') self.assertEquals(get_new_values(diff)[0], '07-20-2017 00:00:00')
def test_get_diff(self): test_records = make_test_objects('Event', reset = True) old_doc = frappe.get_doc("Event", test_records[0]) new_doc = copy.deepcopy(old_doc) old_doc.color = None new_doc.color = '#fafafa' diff = get_diff(old_doc, new_doc)['changed'] self.assertEquals(get_fieldnames(diff)[0], 'color') self.assertTrue(get_old_values(diff)[0] is None) self.assertEquals(get_new_values(diff)[0], '#fafafa') new_doc.starts_on = "2017-07-20" diff = get_diff(old_doc, new_doc)['changed'] self.assertEquals(get_fieldnames(diff)[0], 'starts_on') self.assertEquals(get_old_values(diff)[0], '01-01-2014 00:00:00') self.assertEquals(get_new_values(diff)[0], '07-20-2017 00:00:00')
def test_get_diff(self): frappe.set_user("Administrator") test_records = make_test_objects("Event", reset=True) old_doc = frappe.get_doc("Event", test_records[0]) new_doc = copy.deepcopy(old_doc) old_doc.color = None new_doc.color = "#fafafa" diff = get_diff(old_doc, new_doc)["changed"] self.assertEqual(get_fieldnames(diff)[0], "color") self.assertTrue(get_old_values(diff)[0] is None) self.assertEqual(get_new_values(diff)[0], "#fafafa") new_doc.starts_on = "2017-07-20" diff = get_diff(old_doc, new_doc)["changed"] self.assertEqual(get_fieldnames(diff)[1], "starts_on") self.assertEqual(get_old_values(diff)[1], "01-01-2014 00:00:00") self.assertEqual(get_new_values(diff)[1], "07-20-2017 00:00:00")
def is_authorized(new_doc): old_doc = new_doc.get_doc_before_save() if old_doc: diff = get_diff(old_doc, new_doc) if diff: for changed in diff.changed: field, old, new = changed if field in ['is_verified', 'retry_count']: frappe.throw('Unauthorized Access') elif new_doc.is_verified or new_doc.retry_count: frappe.throw('Unauthorized Access') else: return
def update_transporter(new_doc, action): if action == "on_update_after_submit": is_gst_transporter_id_changed = False old_doc = new_doc.get_doc_before_save() diff = get_diff(old_doc, new_doc) for changed in diff.changed: field, old, new = changed if field == 'gst_transporter_id' and not old == new: is_gst_transporter_id_changed = True break if new_doc.ewaybill and new_doc.gst_transporter_id and is_gst_transporter_id_changed: if gsp.get_ewb(new_doc): if gsp.update_transporter(new_doc): frappe.msgprint(_('Transporter updated Successfully'))
def on_update(self): if not self.is_new(): b, a = self.get_doc_before_save(), self diff = dictify(get_diff(a, b)) if diff: user = session.user fields = [changed[0] for changed in diff.changed] if 'status' in fields: rooms = chat_room.get(user, filters = ['Chat Room', 'type', '=', 'Direct']) update = dict(user = user, data = dict(status = self.status)) for room in rooms: frappe.publish_realtime('frappe.chat.profile:update', update, room = room.name, after_commit = True) if 'enable_chat' in fields: update = dict(user = user, data = dict(enable_chat = bool(self.enable_chat))) frappe.publish_realtime('frappe.chat.profile:update', update, user = user, after_commit = True)
def update_record(self, doc): id_field = get_id_field(self.doctype) existing_doc = frappe.get_doc(self.doctype, doc.get(id_field.fieldname)) updated_doc = frappe.get_doc(self.doctype, doc.get(id_field.fieldname)) updated_doc.update(doc) if get_diff(existing_doc, updated_doc): # update doc if there are changes updated_doc.flags.updater_reference = { "doctype": self.data_import.doctype, "docname": self.data_import.name, "label": _("via Data Import"), } updated_doc.save() return updated_doc else: # throw if no changes frappe.throw(_("No changes to update"))
def on_update(self): if not self.is_new(): before = self.get_doc_before_save() after = self diff = dictify(get_diff(before, after)) if diff: update = { } for changed in diff.changed: field, old, new = changed if field == 'last_message': new = chat_message.get(new) update.update({ field: new }) if diff.added or diff.removed: update.update(dict(users = [u.user for u in self.users])) update = dict(room = self.name, data = update) frappe.publish_realtime('frappe.chat.room:update', update, room = self.name, after_commit = True)