Exemplo n.º 1
0
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
Exemplo n.º 2
0
    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)
Exemplo n.º 3
0
    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)
Exemplo n.º 4
0
	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')
Exemplo n.º 5
0
	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')
Exemplo n.º 6
0
	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
Exemplo n.º 8
0
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'))
Exemplo n.º 9
0
    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)
Exemplo n.º 10
0
	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"))
Exemplo n.º 11
0
	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)