diff --git a/frappe/__init__.py b/frappe/__init__.py
index ead15ab78d..24dbb5030c 100644
--- a/frappe/__init__.py
+++ b/frappe/__init__.py
@@ -214,6 +214,8 @@ def set_user(username):
local.session.user = username
local.session.sid = username
local.cache = {}
+ local.form_dict = _dict()
+ local.jenv = None
local.session.data = {}
local.user = User(username)
local.role_permissions = {}
diff --git a/frappe/public/js/frappe/upload.js b/frappe/public/js/frappe/upload.js
index 92bd793328..ed79e09191 100644
--- a/frappe/public/js/frappe/upload.js
+++ b/frappe/public/js/frappe/upload.js
@@ -10,7 +10,8 @@ frappe.upload = {
+ __('Upload a file') + ' | '
+ __('Attach as web link') + '
\
diff --git a/frappe/utils/file_manager.py b/frappe/utils/file_manager.py
index 1ea87fbdc2..7237d4933a 100644
--- a/frappe/utils/file_manager.py
+++ b/frappe/utils/file_manager.py
@@ -107,6 +107,9 @@ def save_file(fname, content, dt, dn, decode=False):
if decode:
if isinstance(content, unicode):
content = content.encode("utf-8")
+
+ if "," in content:
+ content = content.split(",")[1]
content = base64.b64decode(content)
file_size = check_max_file_size(content)
@@ -180,6 +183,18 @@ def remove_all(dt, dn):
except Exception, e:
if e.args[0]!=1054: raise # (temp till for patched)
+def remove_file_by_url(file_url, doctype=None, name=None):
+ if doctype and name:
+ fid = frappe.db.get_value("File Data", {"file_url": file_url,
+ "attached_to_doctype": doctype, "attached_to_name": name})
+ else:
+ fid = frappe.db.get_value("File Data", {"file_url": file_url})
+
+ print file_url, doctype, name, fid
+
+ if fid:
+ return remove_file(fid)
+
def remove_file(fid, attached_to_doctype=None, attached_to_name=None):
"""Remove file and File Data entry"""
file_name = None
diff --git a/frappe/utils/jinja.py b/frappe/utils/jinja.py
index bf8abc2d47..098d4c24d4 100644
--- a/frappe/utils/jinja.py
+++ b/frappe/utils/jinja.py
@@ -52,7 +52,8 @@ def get_allowed_functions_for_jenv():
"get_doc": frappe.get_doc,
"get_list": frappe.get_list,
"utils": datautils,
- "user": frappe.session.user
+ "user": frappe.session.user,
+ "date_format": frappe.db.get_default("date_format") or "yyyy-mm-dd"
},
"get_visible_columns": \
frappe.get_attr("frappe.templates.pages.print.get_visible_columns"),
diff --git a/frappe/website/doctype/web_form/test_records.json b/frappe/website/doctype/web_form/test_records.json
index 45dd34fc47..080217e8f8 100644
--- a/frappe/website/doctype/web_form/test_records.json
+++ b/frappe/website/doctype/web_form/test_records.json
@@ -1,6 +1,48 @@
-[
- {
- "doctype": "Web Form",
- "name": "_Test Web Form 1"
- }
-]
+[{
+ "allow_comments": 0,
+ "allow_edit": 1,
+ "allow_multiple": 1,
+ "doc_type": "Event",
+ "docstatus": 0,
+ "doctype": "Web Form",
+ "introduction_text": "Add events",
+ "login_required": 1,
+ "name": "manage-events",
+ "owner": "Administrator",
+ "page_name": "manage-events",
+ "published": 1,
+ "success_url": "/manage-events",
+ "title": "Manage Events",
+ "web_form_fields": [
+ {
+ "doctype": "Web Form Field",
+ "fieldname": "subject",
+ "fieldtype": "Data",
+ "hidden": 0,
+ "idx": 1,
+ "label": "Title",
+ "read_only": 0,
+ "reqd": 1
+ },
+ {
+ "doctype": "Web Form Field",
+ "fieldname": "starts_on",
+ "fieldtype": "Date",
+ "hidden": 0,
+ "idx": 2,
+ "label": "Event Date",
+ "read_only": 0,
+ "reqd": 1
+ },
+ {
+ "doctype": "Web Form Field",
+ "fieldname": "description",
+ "fieldtype": "Text",
+ "hidden": 0,
+ "idx": 3,
+ "label": "Description",
+ "read_only": 0,
+ "reqd": 0
+ }
+ ]
+}]
diff --git a/frappe/website/doctype/web_form/test_web_form.py b/frappe/website/doctype/web_form/test_web_form.py
index cf24c1140c..cc9dc7cf43 100644
--- a/frappe/website/doctype/web_form/test_web_form.py
+++ b/frappe/website/doctype/web_form/test_web_form.py
@@ -4,7 +4,61 @@
import frappe
import unittest
+from frappe.website.render import build_page
+from frappe.website.doctype.web_form.web_form import accept
+
test_records = frappe.get_test_records('Web Form')
class TestWebForm(unittest.TestCase):
- pass
+ def setUp(self):
+ frappe.conf.disable_website_cache = True
+
+ def tearDown(self):
+ frappe.conf.disable_website_cache = False
+
+ def test_basic(self):
+ frappe.set_user("Guest")
+ html = build_page("manage-events")
+ self.assertTrue("Please login to create a new Event" in html)
+
+ def test_logged_in(self):
+ frappe.set_user("Administrator")
+ html = build_page("manage-events")
+ self.assertFalse("Please login to create a new Event" in html)
+ self.assertTrue('"/manage-events?new=1"' in html)
+
+ def test_new(self):
+ frappe.set_user("Administrator")
+ frappe.local.form_dict.new = 1
+ html = build_page("manage-events")
+ self.assertTrue('name="subject"' in html)
+
+ def test_accept(self):
+ frappe.set_user("Administrator")
+ frappe.form_dict.web_form = "manage-events"
+ frappe.form_dict.doctype = "Event"
+ frappe.form_dict.subject = "_Test Event Web Form"
+ frappe.form_dict.description = "_Test Event Description"
+ frappe.form_dict.starts_on = "2014-09-09"
+ accept()
+
+ self.event_name = frappe.db.get_value("Event",
+ {"subject": "_Test Event Web Form"})
+ self.assertTrue(self.event_name)
+
+ def test_edit(self):
+ self.test_accept()
+ frappe.form_dict.web_form = "manage-events"
+ frappe.form_dict.doctype = "Event"
+ frappe.form_dict.name = self.event_name
+ frappe.form_dict.subject = "_Test Event Web Form"
+ frappe.form_dict.description = "_Test Event Description 1"
+ frappe.form_dict.starts_on = "2014-09-09"
+
+ self.assertNotEquals(frappe.db.get_value("Event",
+ self.event_name, "description"), frappe.form_dict.description)
+
+ accept()
+
+ self.assertEquals(frappe.db.get_value("Event",
+ self.event_name, "description"), frappe.form_dict.description)
diff --git a/frappe/website/doctype/web_form/web_form.js b/frappe/website/doctype/web_form/web_form.js
index bacd22c3e8..39198d9b4e 100644
--- a/frappe/website/doctype/web_form/web_form.js
+++ b/frappe/website/doctype/web_form/web_form.js
@@ -18,6 +18,7 @@ frappe.web_form = {
frappe.ui.form.on("Web Form", "refresh", function(frm) {
frappe.web_form.set_fieldname_select(frm);
+ cur_frm.set_intro("");
if (!frm.doc.__islocal && frm.doc.published) {
cur_frm.set_intro(__("Published on website at: {0}",
[repl('
/%(website_route)s',
@@ -26,6 +27,14 @@ frappe.ui.form.on("Web Form", "refresh", function(frm) {
});
+frappe.ui.form.on("Web Form", "title", function(frm) {
+ if(frm.doc.__islocal) {
+ var page_name = frm.doc.title.toLowerCase().replace(/ /g, "-");
+ frm.set_value("page_name", page_name);
+ frm.set_value("success_url", "/" + page_name);
+ }
+});
+
frappe.ui.form.on("Web Form", "doc_type", function(frm) {
frappe.web_form.set_fieldname_select(frm);
});
diff --git a/frappe/website/doctype/web_form/web_form.json b/frappe/website/doctype/web_form/web_form.json
index 89d9b30742..2c2fa08c4e 100644
--- a/frappe/website/doctype/web_form/web_form.json
+++ b/frappe/website/doctype/web_form/web_form.json
@@ -177,6 +177,12 @@
"label": "Fields",
"permlevel": 0
},
+ {
+ "fieldname": "introduction_text",
+ "fieldtype": "Text",
+ "label": "Introduction",
+ "permlevel": 0
+ },
{
"fieldname": "web_form_fields",
"fieldtype": "Table",
@@ -193,7 +199,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 0,
- "modified": "2014-09-02 13:52:53.494298",
+ "modified": "2014-09-03 14:47:17.181589",
"modified_by": "Administrator",
"module": "Website",
"name": "Web Form",
diff --git a/frappe/website/doctype/web_form/web_form.py b/frappe/website/doctype/web_form/web_form.py
index fca5e4d62e..5b46d8635f 100644
--- a/frappe/website/doctype/web_form/web_form.py
+++ b/frappe/website/doctype/web_form/web_form.py
@@ -2,9 +2,10 @@
# For license information, please see license.txt
from __future__ import unicode_literals
-import frappe
+import frappe, json
from frappe.website.website_generator import WebsiteGenerator
from frappe import _
+from frappe.utils.file_manager import save_file, remove_file_by_url
class WebForm(WebsiteGenerator):
template = "templates/generators/web_form.html"
@@ -31,18 +32,35 @@ class WebForm(WebsiteGenerator):
if frappe.form_dict.name:
context.doc = frappe.get_doc(self.doc_type, frappe.form_dict.name)
+ context.types = [f.fieldtype for f in self.web_form_fields]
+
return context
@frappe.whitelist(allow_guest=True)
def accept():
args = frappe.form_dict
+ files = []
+
if args.name:
+ # update
doc = frappe.get_doc(args.doctype, args.name)
else:
+ # insert
doc = frappe.new_doc(args.doctype)
+ # set values
for fieldname, value in args.iteritems():
if fieldname not in ("web_form", "cmd"):
+ if value and value.startswith("{"):
+ try:
+ filedata = json.loads(value)
+ if "__file_attachment" in filedata:
+ files.append((fieldname, filedata))
+ continue
+
+ except ValueError:
+ pass
+
doc.set(fieldname, value)
if args.name:
@@ -59,3 +77,21 @@ def accept():
frappe.throw(_("You must login to submit this form"))
doc.insert(ignore_permissions = True)
+
+ # add files
+ if files:
+ for f in files:
+ fieldname, filedata = f
+
+ # remove earlier attachmed file (if exists)
+ if doc.get(fieldname):
+ remove_file_by_url(doc.get(fieldname), doc.doctype, doc.name)
+
+ # save new file
+ filedoc = save_file(filedata["filename"], filedata["dataurl"],
+ doc.doctype, doc.name, decode=True)
+
+ # update values
+ doc.set(fieldname, filedoc.file_url)
+
+ doc.save()
diff --git a/frappe/website/doctype/web_form_field/web_form_field.json b/frappe/website/doctype/web_form_field/web_form_field.json
index 5e9bf3dd8a..782182b2cc 100644
--- a/frappe/website/doctype/web_form_field/web_form_field.json
+++ b/frappe/website/doctype/web_form_field/web_form_field.json
@@ -36,7 +36,7 @@
"in_list_view": 1,
"label": "Fieldtype",
"no_copy": 0,
- "options": "Attach\nCheck\nData\nHTML\nSelect\nText",
+ "options": "Attach\nCheck\nData\nDate\nDatetime\nHTML\nSelect\nText",
"permlevel": 0,
"print_hide": 0,
"read_only": 0,
@@ -69,6 +69,18 @@
"label": "Mandatory",
"permlevel": 0
},
+ {
+ "fieldname": "read_only",
+ "fieldtype": "Check",
+ "label": "Read Only",
+ "permlevel": 0
+ },
+ {
+ "fieldname": "hidden",
+ "fieldtype": "Check",
+ "label": "Hidden",
+ "permlevel": 0
+ },
{
"allow_on_submit": 0,
"fieldname": "column_break_4",
@@ -182,7 +194,7 @@
"is_submittable": 0,
"issingle": 0,
"istable": 1,
- "modified": "2014-09-01 14:14:40.425829",
+ "modified": "2014-09-03 15:47:51.643284",
"modified_by": "Administrator",
"module": "Website",
"name": "Web Form Field",
diff --git a/frappe/website/render.py b/frappe/website/render.py
index 083b3c4708..17c9af9398 100644
--- a/frappe/website/render.py
+++ b/frappe/website/render.py
@@ -3,6 +3,7 @@
from __future__ import unicode_literals
import frappe
+from frappe import _
from frappe.utils import cstr
import mimetypes, json
from werkzeug.wrappers import Response
@@ -36,10 +37,10 @@ def render(path, http_status_code=None):
try:
data = render_page(path)
except frappe.PermissionError, e:
- data, http_status_code = render_403(e)
+ data, http_status_code = render_403(e, path)
except frappe.PermissionError, e:
- data, http_status_code = render_403(e)
+ data, http_status_code = render_403(e, path)
except Exception:
path = "error"
@@ -49,10 +50,13 @@ def render(path, http_status_code=None):
return build_response(path, data, http_status_code or 200)
-def render_403(e):
+def render_403(e, pathname):
path = "message"
- frappe.local.message = "
{error}
Did you log out?
".format(error=cstr(e))
- frappe.local.message_title = "Not Permitted"
+ frappe.local.message = """
{error}
+
+