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') + '

\
\ - \ + \
\ @@ -116,24 +147,85 @@ +{% if allow_comments -%} +
+
+
+

{{ _("Comments") }}

+ {% include 'templates/includes/comments.html' %} +
+
+{%- endif %} {% endif %} {% endblock %} {% block script %} {% endblock %} diff --git a/frappe/templates/includes/login.js b/frappe/templates/includes/login.js index 3b5dbec159..00d81f5460 100644 --- a/frappe/templates/includes/login.js +++ b/frappe/templates/includes/login.js @@ -100,10 +100,13 @@ login.login_handlers = (function() { var login_handlers = { 200: function(data) { if(data.message=="Logged In") { - window.location.href = "desk"; + window.location.href = get_url_arg("redirect-to") || "/desk"; } else if(data.message=="No App") { if(localStorage) { - var last_visited = localStorage.getItem("last_visited") || "/index"; + var last_visited = + localStorage.getItem("last_visited") + || get_url_arg("redirect-to") + || "/index"; localStorage.removeItem("last_visited"); window.location.href = last_visited; } else { diff --git a/frappe/templates/pages/message.html b/frappe/templates/pages/message.html index 2c70bf8457..d57b765f72 100644 --- a/frappe/templates/pages/message.html +++ b/frappe/templates/pages/message.html @@ -1,7 +1,6 @@ {% block title %}{{ title }}{% endblock %} -{% block header %} - {{ title }}{% endblock %} +{% block header %}{{ title }}{% endblock %} {% block content %}
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}

+

+