diff --git a/frappe/config/website.py b/frappe/config/website.py
index 556182aa3b..ad2fba13b1 100644
--- a/frappe/config/website.py
+++ b/frappe/config/website.py
@@ -16,6 +16,11 @@ def get_data():
"name": "Blog Post",
"description": _("Single Post (article)."),
},
+ {
+ "type": "doctype",
+ "name": "Web Form",
+ "description": _("User editable form on Website."),
+ },
{
"type": "doctype",
"name": "Blogger",
diff --git a/frappe/hooks.py b/frappe/hooks.py
index bfee5f3e5d..d1094f25cc 100644
--- a/frappe/hooks.py
+++ b/frappe/hooks.py
@@ -35,7 +35,7 @@ notification_config = "frappe.core.notifications.get_notification_config"
before_tests = "frappe.utils.install.before_tests"
-website_generators = ["Web Page", "Blog Post", "Website Group", "Blog Category"]
+website_generators = ["Web Page", "Blog Post", "Website Group", "Blog Category", "Web Form"]
# permissions
diff --git a/frappe/public/js/frappe/form/script_manager.js b/frappe/public/js/frappe/form/script_manager.js
index bd17d0a519..50a2d19933 100644
--- a/frappe/public/js/frappe/form/script_manager.js
+++ b/frappe/public/js/frappe/form/script_manager.js
@@ -13,6 +13,10 @@ frappe.ui.form.on = frappe.ui.form.on_change = function(doctype, fieldname, hand
frappe.ui.form.handlers[doctype][fieldname].push(handler)
}
+frappe.ui.form.trigger = function(doctype, fieldname, callback) {
+ cur_frm.script_manager.trigger(fieldname, doctype, null, callback);
+}
+
frappe.ui.form.ScriptManager = Class.extend({
init: function(opts) {
$.extend(this, opts);
diff --git a/frappe/templates/generators/web_form.html b/frappe/templates/generators/web_form.html
new file mode 100644
index 0000000000..04db1d670e
--- /dev/null
+++ b/frappe/templates/generators/web_form.html
@@ -0,0 +1,116 @@
+{% block title %}{{ title }}{% endblock %}
+
+{% block header %}
+{{ title }}
+{% endblock %}
+
+{% block content %}
+
+{% if login_required and user=="Guest" %}
+
{{ _("Please login to create a new {0}").format(_(doc_type)) }}
+
+{% else %}
+
+
+{% endif %}
+{% endblock %}
+
+{% block script %}
+
+{% endblock %}
diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py
index 73b3ff9f47..bf8abc2d47 100644
--- a/frappe/utils/jinja.py
+++ b/frappe/utils/jinja.py
@@ -51,7 +51,8 @@ def get_allowed_functions_for_jenv():
"get_meta": frappe.get_meta,
"get_doc": frappe.get_doc,
"get_list": frappe.get_list,
- "utils": datautils
+ "utils": datautils,
+ "user": frappe.session.user
},
"get_visible_columns": \
frappe.get_attr("frappe.templates.pages.print.get_visible_columns"),
diff --git a/frappe/website/doctype/web_form/__init__.py b/frappe/website/doctype/web_form/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/frappe/website/doctype/web_form/test_records.json b/frappe/website/doctype/web_form/test_records.json
new file mode 100644
index 0000000000..45dd34fc47
--- /dev/null
+++ b/frappe/website/doctype/web_form/test_records.json
@@ -0,0 +1,6 @@
+[
+ {
+ "doctype": "Web Form",
+ "name": "_Test Web Form 1"
+ }
+]
diff --git a/frappe/website/doctype/web_form/test_web_form.py b/frappe/website/doctype/web_form/test_web_form.py
new file mode 100644
index 0000000000..cf24c1140c
--- /dev/null
+++ b/frappe/website/doctype/web_form/test_web_form.py
@@ -0,0 +1,10 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and Contributors
+# See license.txt
+
+import frappe
+import unittest
+
+test_records = frappe.get_test_records('Web Form')
+
+class TestWebForm(unittest.TestCase):
+ pass
diff --git a/frappe/website/doctype/web_form/web_form.js b/frappe/website/doctype/web_form/web_form.js
new file mode 100644
index 0000000000..bacd22c3e8
--- /dev/null
+++ b/frappe/website/doctype/web_form/web_form.js
@@ -0,0 +1,47 @@
+frappe.web_form = {
+ set_fieldname_select: function(frm) {
+ var me = this,
+ doc = frm.doc;
+ if(doc.doc_type) {
+ frappe.model.with_doctype(doc.doc_type, function() {
+ var fields = $.map(frappe.get_doc("DocType", frm.doc.doc_type).fields, function(d) {
+ return frappe.model.no_value_type.indexOf(d.fieldtype)===-1 ?
+ d.fieldname : null;
+ })
+ frappe.meta.get_docfield("Web Form Field", "fieldname", frm.doc.name).options
+ = [""].concat(fields);
+ });
+ }
+ }
+}
+
+frappe.ui.form.on("Web Form", "refresh", function(frm) {
+ frappe.web_form.set_fieldname_select(frm);
+
+ if (!frm.doc.__islocal && frm.doc.published) {
+ cur_frm.set_intro(__("Published on website at: {0}",
+ [repl('/%(website_route)s',
+ frm.doc.__onload)]));
+ }
+
+});
+
+frappe.ui.form.on("Web Form", "doc_type", function(frm) {
+ frappe.web_form.set_fieldname_select(frm);
+});
+
+frappe.ui.form.on("Web Form Field", "fieldname", function(frm, doctype, name) {
+ var doc = frappe.get_doc(doctype, name);
+ df = $.map(frappe.get_doc("DocType", frm.doc.doc_type).fields, function(d) {
+ return doc.fieldname==d.fieldname ? d : null; })[0];
+
+ doc.label = df.label;
+ doc.reqd = df.reqd;
+ doc.options = df.options;
+ doc.fieldtype = frappe.meta.get_docfield("Web Form Field", "fieldtype")
+ .options.split("\n").indexOf(df.fieldtype)===-1 ? "Data" : df.fieldtype;
+ doc.description = df.description;
+ doc["default"] = df["default"];
+
+ frm.refresh_field("web_form_fields");
+});
diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json
new file mode 100644
index 0000000000..8ea96e656c
--- /dev/null
+++ b/frappe/website/doctype/web_form/web_form.json
@@ -0,0 +1,219 @@
+{
+ "allow_copy": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "autoname": "field:title",
+ "creation": "2014-09-01 14:08:48.624556",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "Transaction",
+ "fields": [
+ {
+ "allow_on_submit": 0,
+ "fieldname": "title",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Title",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "description": "Website URL",
+ "fieldname": "page_name",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Page Name",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "doc_type",
+ "fieldtype": "Link",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Select DocType",
+ "no_copy": 0,
+ "options": "DocType",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "column_break_4",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "fieldname": "published",
+ "fieldtype": "Check",
+ "label": "Published",
+ "permlevel": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "login_required",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Login Required",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "depends_on": "login_required",
+ "fieldname": "allow_edit",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Allow Edit",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "depends_on": "login_required",
+ "fieldname": "allow_multiple",
+ "fieldtype": "Check",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Allow Multiple",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "fieldname": "actions",
+ "fieldtype": "Section Break",
+ "label": "Actions",
+ "permlevel": 0
+ },
+ {
+ "description": "Message to be displayed on successful completion",
+ "fieldname": "success_message",
+ "fieldtype": "Text",
+ "label": "Success Message",
+ "permlevel": 0
+ },
+ {
+ "description": "Go to this url after completing the form.",
+ "fieldname": "success_url",
+ "fieldtype": "Data",
+ "label": "Success URL",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "fields",
+ "fieldtype": "Section Break",
+ "label": "Fields",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "web_form_fields",
+ "fieldtype": "Table",
+ "label": "Web Form Fields",
+ "options": "Web Form Field",
+ "permlevel": 0
+ }
+ ],
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "icon": "icon-edit",
+ "in_create": 0,
+ "in_dialog": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 0,
+ "modified": "2014-09-01 18:12:25.643567",
+ "modified_by": "Administrator",
+ "module": "Website",
+ "name": "Web Form",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [
+ {
+ "amend": 0,
+ "apply_user_permissions": 0,
+ "cancel": 0,
+ "create": 1,
+ "delete": 1,
+ "email": 0,
+ "export": 0,
+ "import": 0,
+ "permlevel": 0,
+ "print": 0,
+ "read": 1,
+ "report": 1,
+ "role": "Website Manager",
+ "set_user_permissions": 0,
+ "submit": 0,
+ "write": 1
+ }
+ ],
+ "read_only": 0,
+ "read_only_onload": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py
new file mode 100644
index 0000000000..cf20d0971e
--- /dev/null
+++ b/frappe/website/doctype/web_form/web_form.py
@@ -0,0 +1,50 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.website.website_generator import WebsiteGenerator
+
+# parameters
+# name (edit)
+# new
+
+class WebForm(WebsiteGenerator):
+ template = "templates/generators/web_form.html"
+ condition_field = "published"
+ page_title_field = "title"
+ no_cache = 1
+
+ def get_context(self, context):
+ context.params = frappe.form_dict
+ if frappe.form_dict.name:
+ context.doc = frappe.get_doc(self.doc_type, frappe.form_dict.name)
+
+ return context
+
+@frappe.whitelist(allow_guest=True)
+def accept():
+ args = frappe.form_dict
+ if args.name:
+ doc = frappe.get_doc(args.doctype, args.name)
+ else:
+ doc = frappe.new_doc(args.doctype)
+
+ for fieldname, value in args.iteritems():
+ if fieldname not in ("web_form", "cmd"):
+ doc.set(fieldname, value)
+
+ if args.name:
+ if doc.owner==frappe.session.user:
+ doc.update(ignore_permissions=True)
+ else:
+ # only if permissions are present
+ doc.update()
+
+ else:
+ # insert
+ web_form = frappe.get_doc("Web Form", args.web_form)
+ if web_form.login_required and frappe.session.user=="Guest":
+ frappe.throw(_("You must login to submit this form"))
+
+ doc.insert(ignore_permissions = True)
diff --git a/frappe/website/doctype/web_form_field/__init__.py b/frappe/website/doctype/web_form_field/__init__.py
new file mode 100644
index 0000000000..e69de29bb2
diff --git a/frappe/website/doctype/web_form_field/web_form_field.json b/frappe/website/doctype/web_form_field/web_form_field.json
new file mode 100644
index 0000000000..5e9bf3dd8a
--- /dev/null
+++ b/frappe/website/doctype/web_form_field/web_form_field.json
@@ -0,0 +1,196 @@
+{
+ "allow_copy": 0,
+ "allow_import": 0,
+ "allow_rename": 0,
+ "creation": "2014-09-01 14:14:14.292173",
+ "custom": 0,
+ "docstatus": 0,
+ "doctype": "DocType",
+ "document_type": "",
+ "fields": [
+ {
+ "allow_on_submit": 0,
+ "fieldname": "fieldname",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Fieldname",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "fieldtype",
+ "fieldtype": "Select",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Fieldtype",
+ "no_copy": 0,
+ "options": "Attach\nCheck\nData\nHTML\nSelect\nText",
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "label",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Label",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 1,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "fieldname": "reqd",
+ "fieldtype": "Check",
+ "label": "Mandatory",
+ "permlevel": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "column_break_4",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "options",
+ "fieldtype": "Text",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 1,
+ "label": "Options",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "section_break_6",
+ "fieldtype": "Section Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "description",
+ "fieldtype": "Text",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Description",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "column_break_8",
+ "fieldtype": "Column Break",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ },
+ {
+ "allow_on_submit": 0,
+ "fieldname": "default",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "ignore_user_permissions": 0,
+ "in_filter": 0,
+ "in_list_view": 0,
+ "label": "Default",
+ "no_copy": 0,
+ "permlevel": 0,
+ "print_hide": 0,
+ "read_only": 0,
+ "report_hide": 0,
+ "reqd": 0,
+ "search_index": 0,
+ "set_only_once": 0
+ }
+ ],
+ "hide_heading": 0,
+ "hide_toolbar": 0,
+ "in_create": 0,
+ "in_dialog": 0,
+ "is_submittable": 0,
+ "issingle": 0,
+ "istable": 1,
+ "modified": "2014-09-01 14:14:40.425829",
+ "modified_by": "Administrator",
+ "module": "Website",
+ "name": "Web Form Field",
+ "name_case": "",
+ "owner": "Administrator",
+ "permissions": [],
+ "read_only": 0,
+ "read_only_onload": 0,
+ "sort_field": "modified",
+ "sort_order": "DESC"
+}
\ No newline at end of file
diff --git a/frappe/website/doctype/web_form_field/web_form_field.py b/frappe/website/doctype/web_form_field/web_form_field.py
new file mode 100644
index 0000000000..bb00ea934f
--- /dev/null
+++ b/frappe/website/doctype/web_form_field/web_form_field.py
@@ -0,0 +1,9 @@
+# Copyright (c) 2013, Web Notes Technologies Pvt. Ltd. and contributors
+# For license information, please see license.txt
+
+from __future__ import unicode_literals
+import frappe
+from frappe.model.document import Document
+
+class WebFormField(Document):
+ pass
diff --git a/frappe/website/router.py b/frappe/website/router.py
index 85ddbbdd5a..0cc6831353 100644
--- a/frappe/website/router.py
+++ b/frappe/website/router.py
@@ -96,7 +96,7 @@ def clear_sitemap():
if meta.get_field("parent_website_route"):
query = "select page_name, parent_website_route from `tab{0}`"
else:
- query = "select page_name, "" from `tab{0}`"
+ query = "select page_name, '' from `tab{0}`"
for r in frappe.db.sql(query.format(doctype)):
if r[0]: