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 %} +
+
+ + + {% if params.name -%} + + {%- endif %} +{% for field in web_form_fields %} + {% if field.fieldtype=="Data" %} +
+ +
+ + {% if field.description -%} + {{ field.description }} + {%- endif %} +
+
+ {% elif field.fieldtype=="Select" %} +
+ +
+ + {% if field.description -%} + {{ field.description }} + {%- endif %} +
+
+ {% elif field.fieldtype=="Text" %} +
+ +
+ + {% if field.description -%} + {{ field.description }} + {%- endif %} +
+
+ {% elif field.fieldtype=="Check" %} +
+
+
+ +
+
+
+ {% endif %} +{% endfor %} +
+
+ +
+
+
+{% 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]: