浏览代码

[fix] Add/Drop unique based on property setter

version-14
Anand Doshi 10 年前
父节点
当前提交
f525520788
共有 2 个文件被更改,包括 21 次插入10 次删除
  1. +3
    -0
      frappe/custom/doctype/customize_form/customize_form.py
  2. +18
    -10
      frappe/model/db_schema.py

+ 3
- 0
frappe/custom/doctype/customize_form/customize_form.py 查看文件

@@ -135,6 +135,9 @@ class CustomizeForm(Document):
and cint(df.get("precision")) > cint(meta_df[0].get("precision")):
update_db = True

elif property == "unique":
update_db = True

self.make_property_setter(property=property, value=df.get(property),
property_type=self.docfield_properties[property], fieldname=df.fieldname)



+ 18
- 10
frappe/model/db_schema.py 查看文件

@@ -140,6 +140,7 @@ class DbTable:
"""
fl = frappe.db.sql("SELECT * FROM tabDocField WHERE parent = %s", self.doctype, as_dict = 1)
precisions = {}
uniques = {}

if not frappe.flags.in_install:
custom_fl = frappe.db.sql("""\
@@ -152,10 +153,15 @@ class DbTable:
filters={"doc_type": self.doctype, "doctype_or_field": "DocField", "property": "precision"}):
precisions[ps.field_name] = ps.value

# apply unique from property setters
for ps in frappe.get_all("Property Setter", fields=["field_name", "value"],
filters={"doc_type": self.doctype, "doctype_or_field": "DocField", "property": "unique"}):
uniques[ps.field_name] = cint(ps.value)

for f in fl:
self.columns[f['fieldname']] = DbColumn(self, f['fieldname'],
f['fieldtype'], f.get('length'), f.get('default'), f.get('search_index'),
f.get('options'), f.get('unique'), precisions.get(f['fieldname']) or f.get('precision'))
f.get('options'), uniques.get(f["fieldname"], f.get('unique')), precisions.get(f['fieldname']) or f.get('precision'))

def get_columns_from_db(self):
self.show_columns = frappe.db.sql("desc `%s`" % self.name)
@@ -294,18 +300,11 @@ class DbColumn:
return

# type
if (current_def['type'] != column_def) or (self.unique and not current_def['unique'] \
and column_def not in ('text', 'longtext')):
if (current_def['type'] != column_def) or \
((self.unique and not current_def['unique']) and column_def not in ('text', 'longtext')):
self.table.change_type.append(self)

else:
# index
if current_def['index'] and not self.set_index and not self.unique:
self.table.drop_index.append(self)
if (not current_def['index'] and self.set_index) and not (column_def in ('text', 'longtext')):
self.table.add_index.append(self)

# default
if (self.default_changed(current_def) \
and (self.default not in default_shortcuts) \
@@ -313,6 +312,15 @@ class DbColumn:
and not (column_def in ['text','longtext'])):
self.table.set_default.append(self)

# index should be applied or dropped irrespective of type change
if ( (current_def['index'] and not self.set_index and not self.unique)
or (current_def['unique'] and not self.unique) ):
# to drop unique you have to drop index
self.table.drop_index.append(self)

elif (not current_def['index'] and self.set_index) and not (column_def in ('text', 'longtext')):
self.table.add_index.append(self)

def default_changed(self, current_def):
if "decimal" in current_def['type']:
return self.default_changed_for_decimal(current_def)


正在加载...
取消
保存