diff --git a/frappe/database/schema.py b/frappe/database/schema.py index 3661ec1994..da2dba1924 100644 --- a/frappe/database/schema.py +++ b/frappe/database/schema.py @@ -200,7 +200,12 @@ class DbColumn: self.not_nullable = not_nullable def get_definition(self, for_modification=False): - column_def = get_definition(self.fieldtype, precision=self.precision, length=self.length) + column_def = get_definition( + self.fieldtype, + precision=self.precision, + length=self.length, + options=self.options, + ) if not column_def: return column_def @@ -356,9 +361,20 @@ def validate_column_length(fieldname): frappe.throw(_("Fieldname is limited to 64 characters ({0})").format(fieldname)) -def get_definition(fieldtype, precision=None, length=None): +def get_definition(fieldtype, precision=None, length=None, *, options=None): d = frappe.db.type_map.get(fieldtype) + if ( + fieldtype == "Link" + and options + # XXX: This might not trigger if referred doctype is not yet created + # This is largely limitation of how migration happens though. + # Maybe we can sort by creation and then modified? + and frappe.db.exists("DocType", options) + and frappe.get_meta(options).autoname == "UUID" + ): + d = ("uuid", None) + if not d: return diff --git a/frappe/tests/test_db_update.py b/frappe/tests/test_db_update.py index b0ee59fba6..aebd5ed8e8 100644 --- a/frappe/tests/test_db_update.py +++ b/frappe/tests/test_db_update.py @@ -163,6 +163,17 @@ class TestDBUpdate(FrappeTestCase): self.assertIn(varchar, frappe.db.get_column_type(doctype.name, "name")) doc.reload() # ensure that docs are still accesible + def test_uuid_link_field(self): + uuid_doctype = new_doctype().update({"autoname": "UUID"}).insert() + self.assertEqual(frappe.db.get_column_type(uuid_doctype.name, "name"), "uuid") + + link = "link_field" + referring_doctype = new_doctype( + fields=[{"fieldname": link, "fieldtype": "Link", "options": uuid_doctype.name}] + ).insert() + + self.assertEqual(frappe.db.get_column_type(referring_doctype.name, link), "uuid") + def get_fieldtype_from_def(field_def): fieldtuple = frappe.db.type_map.get(field_def.fieldtype, ("", 0))