@@ -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", | |||
@@ -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 | |||
@@ -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); | |||
@@ -0,0 +1,116 @@ | |||
{% block title %}{{ title }}{% endblock %} | |||
{% block header %} | |||
{{ title }} | |||
{% endblock %} | |||
{% block content %} | |||
{% if login_required and user=="Guest" %} | |||
<div class="alert alert-warning">{{ _("Please login to create a new {0}").format(_(doc_type)) }}</div> | |||
{% else %} | |||
<div class="form-message alert alert-info hide"></div> | |||
<form class="form-horizontal" role="form" | |||
data-web-form="{{ name }}"> | |||
<input type="hidden" name="web_form" value="{{ name }}"> | |||
<input type="hidden" name="doctype" value="{{ doc_type }}"> | |||
{% if params.name -%} | |||
<input type="hidden" name="name" value="{{ params.name }}"> | |||
{%- endif %} | |||
{% for field in web_form_fields %} | |||
{% if field.fieldtype=="Data" %} | |||
<div class="form-group"> | |||
<label for="{{ field.fieldname }}" class="col-sm-3 control-label"> | |||
{{ field.label }}</label> | |||
<div class="col-sm-9"> | |||
<input type="text" class="form-control" name="{{ field.fieldname }}" | |||
id="{{ field.fieldname }}" placeholder="{{ field.placeholder or '' }}"> | |||
{% if field.description -%} | |||
<span class="help-block">{{ field.description }}</span> | |||
{%- endif %} | |||
</div> | |||
</div> | |||
{% elif field.fieldtype=="Select" %} | |||
<div class="form-group"> | |||
<label for="{{ field.fieldname }}" class="col-sm-3 control-label"> | |||
{{ field.label }}</label> | |||
<div class="col-sm-9"> | |||
<select class="form-control" name="{{ field.fieldname }}" | |||
id="{{ field.fieldname }}"> | |||
{% for option in field.options.split("\n") %} | |||
<option value="{{ option }}">{{ option }}</option> | |||
{% endfor %} | |||
</select> | |||
{% if field.description -%} | |||
<span class="help-block">{{ field.description }}</span> | |||
{%- endif %} | |||
</div> | |||
</div> | |||
{% elif field.fieldtype=="Text" %} | |||
<div class="form-group"> | |||
<label for="{{ field.fieldname }}" class="col-sm-3 control-label"> | |||
{{ field.label }}</label> | |||
<div class="col-sm-9"> | |||
<textarea class="form-control" name="{{ field.fieldname }}" | |||
id="{{ field.fieldname }}" style="height: 100px;"></textarea> | |||
{% if field.description -%} | |||
<span class="help-block">{{ field.description }}</span> | |||
{%- endif %} | |||
</div> | |||
</div> | |||
{% elif field.fieldtype=="Check" %} | |||
<div class="form-group"> | |||
<div class="col-sm-offset-3 col-sm-9"> | |||
<div class="checkbox"> | |||
<label> | |||
<input type="checkbox" id="{{ field.fieldname }}" | |||
name="{{ field.fieldname }}"> {{ field.label }} | |||
</label> | |||
</div> | |||
</div> | |||
</div> | |||
{% endif %} | |||
{% endfor %} | |||
<div class="form-group"> | |||
<div class="col-sm-offset-3 col-sm-9"> | |||
<button type="submit" class="btn btn-primary">Submit</button> | |||
</div> | |||
</div> | |||
</form> | |||
{% endif %} | |||
{% endblock %} | |||
{% block script %} | |||
<script> | |||
frappe.ready(function() { | |||
var args = {}, | |||
$form = $("form[data-web-form='{{ name }}']"); | |||
$form.find("[name]").each(function() { | |||
args[$(this).attr("name")] = $(this).val(); | |||
}); | |||
$("form[data-web-form='{{ name }}']").on("submit", function() { | |||
args = | |||
frappe.call({ | |||
type: "POST", | |||
method: "frappe.website.doctype.web_form.web_form.accept", | |||
args: args, | |||
btn: $form.find("[type='submit']"), | |||
callback: function(data) { | |||
if(!data.exc) { | |||
$form.addClass("hide"); | |||
$(".form-message") | |||
.html("{{ success_message or 'Thank You!' }}") | |||
.removeClass("hide"); | |||
{% if success_url -%} | |||
window.location.href = "{{ success_url }}" | |||
{%- endif %}; | |||
} | |||
} | |||
}) | |||
return false; | |||
}) | |||
}); | |||
</script> | |||
{% endblock %} |
@@ -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"), | |||
@@ -0,0 +1,6 @@ | |||
[ | |||
{ | |||
"doctype": "Web Form", | |||
"name": "_Test Web Form 1" | |||
} | |||
] |
@@ -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 |
@@ -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('<a href="/%(website_route)s" target="_blank">/%(website_route)s</a>', | |||
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"); | |||
}); |
@@ -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" | |||
} |
@@ -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) |
@@ -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" | |||
} |
@@ -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 |
@@ -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]: | |||