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:
Anand Doshi 2015-11-24 13:19:01 +05:30
commit fb72f4d2f6
6 changed files with 88 additions and 74 deletions

View file

@ -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

View file

@ -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:

View file

@ -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",
}

View file

@ -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>

View file

@ -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

View file

@ -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",