Merge pull request #1423 from anandpdoshi/fix/web-form-customization
Apply docfield customization in webforms based on fieldname, don't add custom fields, translate labels in webforms
This commit is contained in:
commit
fb72f4d2f6
6 changed files with 88 additions and 74 deletions
|
|
@ -146,7 +146,8 @@ def add_home_page(bootinfo, docs):
|
|||
try:
|
||||
page = frappe.desk.desk_page.get(home_page)
|
||||
except (frappe.DoesNotExistError, frappe.PermissionError):
|
||||
frappe.message_log.pop()
|
||||
if frappe.message_log:
|
||||
frappe.message_log.pop()
|
||||
page = frappe.desk.desk_page.get('desktop')
|
||||
|
||||
bootinfo['home_page'] = page.name
|
||||
|
|
|
|||
|
|
@ -13,48 +13,48 @@ from frappe.model.document import Document
|
|||
from frappe.model import no_value_fields
|
||||
from frappe.core.doctype.doctype.doctype import validate_fields_for_doctype
|
||||
|
||||
doctype_properties = {
|
||||
'search_fields': 'Data',
|
||||
'title_field': 'Data',
|
||||
'sort_field': 'Data',
|
||||
'sort_order': 'Data',
|
||||
'default_print_format': 'Data',
|
||||
'read_only_onload': 'Check',
|
||||
'allow_copy': 'Check',
|
||||
'max_attachments': 'Int'
|
||||
}
|
||||
|
||||
docfield_properties = {
|
||||
'idx': 'Int',
|
||||
'label': 'Data',
|
||||
'fieldtype': 'Select',
|
||||
'options': 'Text',
|
||||
'permlevel': 'Int',
|
||||
'width': 'Data',
|
||||
'print_width': 'Data',
|
||||
'reqd': 'Check',
|
||||
'unique': 'Check',
|
||||
'ignore_user_permissions': 'Check',
|
||||
'in_filter': 'Check',
|
||||
'in_list_view': 'Check',
|
||||
'hidden': 'Check',
|
||||
'collapsible': 'Check',
|
||||
'collapsible_depends_on': 'Data',
|
||||
'print_hide': 'Check',
|
||||
'report_hide': 'Check',
|
||||
'allow_on_submit': 'Check',
|
||||
'depends_on': 'Data',
|
||||
'description': 'Text',
|
||||
'default': 'Text',
|
||||
'precision': 'Select',
|
||||
'read_only': 'Check',
|
||||
'length': 'Int'
|
||||
}
|
||||
|
||||
allowed_fieldtype_change = (('Currency', 'Float', 'Percent'), ('Small Text', 'Data'),
|
||||
('Text', 'Text Editor', 'Code'), ('Data', 'Select'), ('Text', 'Small Text'))
|
||||
|
||||
class CustomizeForm(Document):
|
||||
doctype_properties = {
|
||||
'search_fields': 'Data',
|
||||
'title_field': 'Data',
|
||||
'sort_field': 'Data',
|
||||
'sort_order': 'Data',
|
||||
'default_print_format': 'Data',
|
||||
'read_only_onload': 'Check',
|
||||
'allow_copy': 'Check',
|
||||
'max_attachments': 'Int'
|
||||
}
|
||||
|
||||
docfield_properties = {
|
||||
'idx': 'Int',
|
||||
'label': 'Data',
|
||||
'fieldtype': 'Select',
|
||||
'options': 'Text',
|
||||
'permlevel': 'Int',
|
||||
'width': 'Data',
|
||||
'print_width': 'Data',
|
||||
'reqd': 'Check',
|
||||
'unique': 'Check',
|
||||
'ignore_user_permissions': 'Check',
|
||||
'in_filter': 'Check',
|
||||
'in_list_view': 'Check',
|
||||
'hidden': 'Check',
|
||||
'collapsible': 'Check',
|
||||
'collapsible_depends_on': 'Data',
|
||||
'print_hide': 'Check',
|
||||
'report_hide': 'Check',
|
||||
'allow_on_submit': 'Check',
|
||||
'depends_on': 'Data',
|
||||
'description': 'Text',
|
||||
'default': 'Text',
|
||||
'precision': 'Select',
|
||||
'read_only': 'Check',
|
||||
'length': 'Int'
|
||||
}
|
||||
|
||||
allowed_fieldtype_change = (('Currency', 'Float', 'Percent'), ('Small Text', 'Data'),
|
||||
('Text', 'Text Editor', 'Code'), ('Data', 'Select'), ('Text', 'Small Text'))
|
||||
|
||||
def on_update(self):
|
||||
frappe.db.sql("delete from tabSingles where doctype='Customize Form'")
|
||||
frappe.db.sql("delete from `tabCustomize Form Field`")
|
||||
|
|
@ -67,12 +67,12 @@ class CustomizeForm(Document):
|
|||
meta = frappe.get_meta(self.doc_type)
|
||||
|
||||
# doctype properties
|
||||
for property in self.doctype_properties:
|
||||
for property in doctype_properties:
|
||||
self.set(property, meta.get(property))
|
||||
|
||||
for d in meta.get("fields"):
|
||||
new_d = {"fieldname": d.fieldname, "is_custom_field": d.get("is_custom_field"), "name": d.name}
|
||||
for property in self.docfield_properties:
|
||||
for property in docfield_properties:
|
||||
new_d[property] = d.get(property)
|
||||
self.append("fields", new_d)
|
||||
|
||||
|
|
@ -106,10 +106,10 @@ class CustomizeForm(Document):
|
|||
def set_property_setters(self):
|
||||
meta = frappe.get_meta(self.doc_type)
|
||||
# doctype property setters
|
||||
for property in self.doctype_properties:
|
||||
for property in doctype_properties:
|
||||
if self.get(property) != meta.get(property):
|
||||
self.make_property_setter(property=property, value=self.get(property),
|
||||
property_type=self.doctype_properties[property])
|
||||
property_type=doctype_properties[property])
|
||||
|
||||
update_db = False
|
||||
for df in self.get("fields"):
|
||||
|
|
@ -121,7 +121,7 @@ class CustomizeForm(Document):
|
|||
if not meta_df or meta_df[0].get("is_custom_field"):
|
||||
continue
|
||||
|
||||
for property in self.docfield_properties:
|
||||
for property in docfield_properties:
|
||||
if property != "idx" and df.get(property) != meta_df[0].get(property):
|
||||
if property == "fieldtype":
|
||||
self.validate_fieldtype_change(df, meta_df[0].get(property), df.get(property))
|
||||
|
|
@ -150,7 +150,7 @@ class CustomizeForm(Document):
|
|||
continue
|
||||
|
||||
self.make_property_setter(property=property, value=df.get(property),
|
||||
property_type=self.docfield_properties[property], fieldname=df.fieldname)
|
||||
property_type=docfield_properties[property], fieldname=df.fieldname)
|
||||
|
||||
if update_db:
|
||||
from frappe.model.db_schema import updatedb
|
||||
|
|
@ -168,7 +168,7 @@ class CustomizeForm(Document):
|
|||
def add_custom_field(self, df):
|
||||
d = frappe.new_doc("Custom Field")
|
||||
d.dt = self.doc_type
|
||||
for property in self.docfield_properties:
|
||||
for property in docfield_properties:
|
||||
d.set(property, df.get(property))
|
||||
d.insert()
|
||||
df.fieldname = d.fieldname
|
||||
|
|
@ -181,7 +181,7 @@ class CustomizeForm(Document):
|
|||
|
||||
custom_field = frappe.get_doc("Custom Field", meta_df[0].name)
|
||||
changed = False
|
||||
for property in self.docfield_properties:
|
||||
for property in docfield_properties:
|
||||
if df.get(property) != custom_field.get(property):
|
||||
if property == "fieldtype":
|
||||
self.validate_fieldtype_change(df, meta_df[0].get(property), df.get(property))
|
||||
|
|
@ -260,7 +260,7 @@ class CustomizeForm(Document):
|
|||
|
||||
def validate_fieldtype_change(self, df, old_value, new_value):
|
||||
allowed = False
|
||||
for allowed_changes in self.allowed_fieldtype_change:
|
||||
for allowed_changes in allowed_fieldtype_change:
|
||||
if (old_value in allowed_changes and new_value in allowed_changes):
|
||||
allowed = True
|
||||
if not allowed:
|
||||
|
|
|
|||
|
|
@ -163,7 +163,8 @@ scheduler_events = {
|
|||
default_background = "/assets/frappe/images/ui/into-the-dawn.jpg"
|
||||
|
||||
get_translated_dict = {
|
||||
("doctype", "System Settings"): "frappe.geo.country_info.get_translated_dict"
|
||||
("doctype", "System Settings"): "frappe.geo.country_info.get_translated_dict",
|
||||
("page", "setup-wizard"): "frappe.geo.country_info.get_translated_dict"
|
||||
}
|
||||
|
||||
sounds = [
|
||||
|
|
@ -176,7 +177,3 @@ sounds = [
|
|||
# {"name": "alert", "src": "/assets/frappe/sounds/alert.mp3"},
|
||||
# {"name": "chime", "src": "/assets/frappe/sounds/chime.mp3"},
|
||||
]
|
||||
|
||||
get_translated_dict = {
|
||||
("page", "setup-wizard"): "frappe.geo.country_info.get_translated_dict",
|
||||
}
|
||||
|
|
|
|||
|
|
@ -44,8 +44,8 @@
|
|||
|
||||
{%- macro properties(field) %}
|
||||
name="{{ field.fieldname }}" id="{{ field.fieldname }}"
|
||||
{% if field.placeholder %}placeholder="{{ field.placeholder }}"{% endif %}
|
||||
data-label="{{ field.label }}" data-fieldtype="{{ field.fieldtype }}"
|
||||
{% if field.placeholder -%} placeholder="{{ _(field.placeholder) }}" {%- endif %}
|
||||
data-label="{{ _(field.label) }}" data-fieldtype="{{ field.fieldtype }}"
|
||||
{{ (field.reqd and field.fieldtype!="Attach") and "required" or "" }}
|
||||
{{ field.read_only and "disabled" or "" }}
|
||||
{% endmacro -%}
|
||||
|
|
@ -54,19 +54,19 @@
|
|||
|
||||
{%- macro help(field) -%}
|
||||
{% if field.description -%}
|
||||
<span class="help-block small">{{ field.description }}</span>
|
||||
<span class="help-block small">{{ _(field.description) }}</span>
|
||||
{%- endif -%}
|
||||
{%- endmacro %}
|
||||
|
||||
{% macro label(field) %}
|
||||
<label for="{{ field.fieldname }}" class="control-label text-muted small">
|
||||
{{ field.label }}</label>
|
||||
{{ _(field.label) }}</label>
|
||||
{% endmacro %}
|
||||
|
||||
{% macro render_field(field) %}
|
||||
{% if field.hidden %}
|
||||
<input type="hidden"
|
||||
name="{{ field.fieldname }}" value="{{ field.default }}">
|
||||
name="{{ field.fieldname }}" {% if field.default -%} value="{{ field.default }}" {%- endif %}>
|
||||
{% elif field.fieldtype == "HTML" and field.options %}
|
||||
<div class="form-group">
|
||||
{{ field.options }}
|
||||
|
|
@ -122,7 +122,7 @@
|
|||
<input type="checkbox" id="{{ field.fieldname }}"
|
||||
name="{{ field.fieldname }}"
|
||||
{{ doc and doc.get(field.fieldname) and 'checked' or '' }}>
|
||||
{{ field.label }}
|
||||
{{ _(field.label) }}
|
||||
</label>
|
||||
{{ help(field) }}
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ from frappe import _
|
|||
from frappe.utils.file_manager import save_file, remove_file_by_url
|
||||
from frappe.website.utils import get_comment_list
|
||||
from frappe.model import default_fields
|
||||
from frappe.custom.doctype.customize_form.customize_form import docfield_properties
|
||||
|
||||
class WebForm(WebsiteGenerator):
|
||||
website = frappe._dict(
|
||||
|
|
@ -28,20 +29,34 @@ class WebForm(WebsiteGenerator):
|
|||
|
||||
def use_meta_fields(self):
|
||||
meta = frappe.get_meta(self.doc_type)
|
||||
# original_web_form_fields = frappe.form_dict((df.fieldname, df) for df in self.web_form_fields)
|
||||
self.web_form_fields = meta.fields
|
||||
|
||||
for df in self.web_form_fields:
|
||||
df.doctype = "Web Form Field"
|
||||
df.parentfield = "web_form_fields"
|
||||
df.parenttype = self.doctype
|
||||
df.parent = self.name
|
||||
meta_df = meta.get_field(df.fieldname)
|
||||
|
||||
if df.read_only or df.fieldtype=="Read Only":
|
||||
df.hidden = 1
|
||||
if not meta_df:
|
||||
continue
|
||||
|
||||
elif df.fieldtype not in ("Attach", "Check", "Data", "Date", "Datetime", "HTML", "Select", "Text", "Section Break", "Column Break"):
|
||||
df.hidden = 1
|
||||
for prop in docfield_properties:
|
||||
if df.fieldtype==meta_df.fieldtype and prop != "idx":
|
||||
df.set(prop, meta_df.get(prop))
|
||||
|
||||
if df.fieldtype == "Link":
|
||||
try:
|
||||
options = [d.name for d in frappe.get_list(df.options)]
|
||||
df.fieldtype = "Select"
|
||||
|
||||
if len(options)==1:
|
||||
df.options = options[0]
|
||||
df.default = options[0]
|
||||
df.hidden = 1
|
||||
|
||||
else:
|
||||
df.options = "\n".join([""] + options)
|
||||
|
||||
except frappe.PermissionError:
|
||||
df.hidden = 1
|
||||
|
||||
# TODO translate options of Select fields like Country
|
||||
|
||||
def get_context(self, context):
|
||||
from frappe.templates.pages.list import get_context as get_list_context
|
||||
|
|
|
|||
|
|
@ -43,7 +43,7 @@
|
|||
"label": "Fieldtype",
|
||||
"length": 0,
|
||||
"no_copy": 0,
|
||||
"options": "Attach\nCheck\nData\nDate\nDatetime\nHTML\nSelect\nText\nSection Break\nColumn Break",
|
||||
"options": "Attach\nCheck\nData\nDate\nDatetime\nHTML\nLink\nSelect\nText\nSection Break\nColumn Break",
|
||||
"permlevel": 0,
|
||||
"print_hide": 0,
|
||||
"read_only": 0,
|
||||
|
|
@ -273,13 +273,14 @@
|
|||
],
|
||||
"hide_heading": 0,
|
||||
"hide_toolbar": 0,
|
||||
"idx": 0,
|
||||
"in_create": 0,
|
||||
"in_dialog": 0,
|
||||
"is_submittable": 0,
|
||||
"issingle": 0,
|
||||
"istable": 1,
|
||||
"max_attachments": 0,
|
||||
"modified": "2015-11-16 06:30:00.409753",
|
||||
"modified": "2015-11-23 07:29:22.198324",
|
||||
"modified_by": "Administrator",
|
||||
"module": "Website",
|
||||
"name": "Web Form Field",
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue