Esempio n. 1
0
def get_standard_permissions(doctype):
    module = frappe.db.get_value("DocType", doctype, "module")
    path = get_file_path(module, "DocType", doctype)
    return [
        d for d in read_doclist_from_file(path)
        if d.get("doctype") == "DocPerm"
    ]
def get_standard_permissions(doctype):
	frappe.only_for("System Manager")
	meta = frappe.get_meta(doctype)
	if meta.custom:
		doc = frappe.get_doc('DocType', doctype)
		return [p.as_dict() for p in doc.permissions]
	else:
		# also used to setup permissions via patch
		path = get_file_path(meta.module, "DocType", doctype)
		return read_doc_from_file(path).get("permissions")
Esempio n. 3
0
def get_standard_permissions(doctype):
	frappe.only_for("System Manager")
	meta = frappe.get_meta(doctype)
	if meta.custom:
		doc = frappe.get_doc('DocType', doctype)
		return [p.as_dict() for p in doc.permissions]
	else:
		# also used to setup permissions via patch
		path = get_file_path(meta.module, "DocType", doctype)
		return read_doc_from_file(path).get("permissions")
Esempio n. 4
0
    def before_export(self, docdict):
        # remove null and empty fields
        def remove_null_fields(o):
            to_remove = []
            for attr, value in iteritems(o):
                if isinstance(value, list):
                    for v in value:
                        remove_null_fields(v)
                elif not value:
                    to_remove.append(attr)

            for attr in to_remove:
                del o[attr]

        remove_null_fields(docdict)

        # retain order of 'fields' table and change order in 'field_order'
        docdict["field_order"] = [f.fieldname for f in self.fields]

        path = get_file_path(self.module, "DocType", self.name)
        if os.path.exists(path):
            try:
                with open(path, 'r') as txtfile:
                    olddoc = json.loads(txtfile.read())

                old_field_names = [
                    f['fieldname'] for f in olddoc.get("fields", [])
                ]
                if old_field_names:
                    new_field_dicts = []
                    remaining_field_names = [f.fieldname for f in self.fields]

                    for fieldname in old_field_names:
                        field_dict = list(
                            filter(lambda d: d['fieldname'] == fieldname,
                                   docdict['fields']))
                        if field_dict:
                            new_field_dicts.append(field_dict[0])
                            remaining_field_names.remove(fieldname)

                    for fieldname in remaining_field_names:
                        field_dict = list(
                            filter(lambda d: d['fieldname'] == fieldname,
                                   docdict['fields']))
                        new_field_dicts.append(field_dict[0])

                    docdict['fields'] = new_field_dicts
            except ValueError:
                pass
Esempio n. 5
0
def get_standard_permissions(doctype):
	frappe.only_for("System Manager")
	module = frappe.db.get_value("DocType", doctype, "module")
	path = get_file_path(module, "DocType", doctype)
	return read_doc_from_file(path).get("permissions")
def get_standard_permissions(doctype):
    frappe.only_for("System Manager")
    module = frappe.db.get_value("DocType", doctype, "module")
    path = get_file_path(module, "DocType", doctype)
    return read_doc_from_file(path).get("permissions")
Esempio n. 7
0
    def test_sync_field_order(self):
        from frappe.modules.import_file import get_file_path
        import os

        # create test doctype
        test_doctype = frappe.get_doc({
            "doctype":
            "DocType",
            "module":
            "Core",
            "fields": [{
                "label": "Field 1",
                "fieldname": "field_1",
                "fieldtype": "Data"
            }, {
                "label": "Field 2",
                "fieldname": "field_2",
                "fieldtype": "Data"
            }, {
                "label": "Field 3",
                "fieldname": "field_3",
                "fieldtype": "Data"
            }, {
                "label": "Field 4",
                "fieldname": "field_4",
                "fieldtype": "Data"
            }],
            "permissions": [{
                "role": "System Manager",
                "read": 1
            }],
            "name":
            "Test Field Order DocType",
            "__islocal":
            1
        })

        path = get_file_path(test_doctype.module, test_doctype.doctype,
                             test_doctype.name)
        initial_fields_order = ['field_1', 'field_2', 'field_3', 'field_4']

        frappe.delete_doc_if_exists("DocType", "Test Field Order DocType")
        if os.path.isfile(path):
            os.remove(path)

        try:
            frappe.flags.allow_doctype_export = 1
            test_doctype.save()

            # assert that field_order list is being created with the default order
            test_doctype_json = frappe.get_file_json(path)
            self.assertTrue(test_doctype_json.get("field_order"))
            self.assertEqual(len(test_doctype_json['fields']),
                             len(test_doctype_json['field_order']))
            self.assertListEqual(
                [f['fieldname'] for f in test_doctype_json['fields']],
                test_doctype_json['field_order'])
            self.assertListEqual(
                [f['fieldname'] for f in test_doctype_json['fields']],
                initial_fields_order)
            self.assertListEqual(test_doctype_json['field_order'],
                                 initial_fields_order)

            # remove field_order to test reload_doc/sync/migrate is backwards compatible without field_order
            del test_doctype_json['field_order']
            with open(path, 'w+') as txtfile:
                txtfile.write(frappe.as_json(test_doctype_json))

            # assert that field_order is actually removed from the json file
            test_doctype_json = frappe.get_file_json(path)
            self.assertFalse(test_doctype_json.get("field_order"))

            # make sure that migrate/sync is backwards compatible without field_order
            frappe.reload_doctype(test_doctype.name, force=True)
            test_doctype.reload()

            # assert that field_order list is being created with the default order again
            test_doctype.save()
            test_doctype_json = frappe.get_file_json(path)
            self.assertTrue(test_doctype_json.get("field_order"))
            self.assertEqual(len(test_doctype_json['fields']),
                             len(test_doctype_json['field_order']))
            self.assertListEqual(
                [f['fieldname'] for f in test_doctype_json['fields']],
                test_doctype_json['field_order'])
            self.assertListEqual(
                [f['fieldname'] for f in test_doctype_json['fields']],
                initial_fields_order)
            self.assertListEqual(test_doctype_json['field_order'],
                                 initial_fields_order)

            # reorder fields: swap row 1 and 3
            test_doctype.fields[0], test_doctype.fields[
                2] = test_doctype.fields[2], test_doctype.fields[0]
            for i, f in enumerate(test_doctype.fields):
                f.idx = i + 1

            # assert that reordering fields only affects `field_order` rather than `fields` attr
            test_doctype.save()
            test_doctype_json = frappe.get_file_json(path)
            self.assertListEqual(
                [f['fieldname'] for f in test_doctype_json['fields']],
                initial_fields_order)
            self.assertListEqual(test_doctype_json['field_order'],
                                 ['field_3', 'field_2', 'field_1', 'field_4'])

            # reorder `field_order` in the json file: swap row 2 and 4
            test_doctype_json['field_order'][1], test_doctype_json[
                'field_order'][3] = test_doctype_json['field_order'][
                    3], test_doctype_json['field_order'][1]
            with open(path, 'w+') as txtfile:
                txtfile.write(frappe.as_json(test_doctype_json))

            # assert that reordering `field_order` from json file is reflected in DocType upon migrate/sync
            frappe.reload_doctype(test_doctype.name, force=True)
            test_doctype.reload()
            self.assertListEqual([f.fieldname for f in test_doctype.fields],
                                 ['field_3', 'field_4', 'field_1', 'field_2'])

            # insert row in the middle and remove first row (field 3)
            test_doctype.append("fields", {
                "label": "Field 5",
                "fieldname": "field_5",
                "fieldtype": "Data"
            })
            test_doctype.fields[4], test_doctype.fields[
                3] = test_doctype.fields[3], test_doctype.fields[4]
            test_doctype.fields[3], test_doctype.fields[
                2] = test_doctype.fields[2], test_doctype.fields[3]
            test_doctype.remove(test_doctype.fields[0])
            for i, f in enumerate(test_doctype.fields):
                f.idx = i + 1

            test_doctype.save()
            test_doctype_json = frappe.get_file_json(path)
            self.assertListEqual(
                [f['fieldname'] for f in test_doctype_json['fields']],
                ['field_1', 'field_2', 'field_4', 'field_5'])
            self.assertListEqual(test_doctype_json['field_order'],
                                 ['field_4', 'field_5', 'field_1', 'field_2'])
        except:
            raise
        finally:
            frappe.flags.allow_doctype_export = 0