From f525520788ea2c0f38a9dd5972c6887145c137e1 Mon Sep 17 00:00:00 2001 From: Anand Doshi Date: Wed, 12 Aug 2015 14:48:31 +0530 Subject: [PATCH] [fix] Add/Drop unique based on property setter --- .../doctype/customize_form/customize_form.py | 3 ++ frappe/model/db_schema.py | 28 ++++++++++++------- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/frappe/custom/doctype/customize_form/customize_form.py b/frappe/custom/doctype/customize_form/customize_form.py index 234dea8971..177be05f6d 100644 --- a/frappe/custom/doctype/customize_form/customize_form.py +++ b/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) diff --git a/frappe/model/db_schema.py b/frappe/model/db_schema.py index 8c5669b526..eecb537604 100644 --- a/frappe/model/db_schema.py +++ b/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)