diff --git a/frappe/core/doctype/feedback/feedback.json b/frappe/core/doctype/feedback/feedback.json index cf8a180e27..b77e7a6677 100644 --- a/frappe/core/doctype/feedback/feedback.json +++ b/frappe/core/doctype/feedback/feedback.json @@ -8,8 +8,8 @@ "reference_doctype", "reference_name", "column_break_3", - "email", "rating", + "ip_address", "section_break_6", "feedback" ], @@ -18,12 +18,6 @@ "fieldname": "column_break_3", "fieldtype": "Column Break" }, - { - "fieldname": "email", - "fieldtype": "Data", - "label": "Email", - "reqd": 1 - }, { "fieldname": "rating", "fieldtype": "Float", @@ -56,11 +50,18 @@ "label": "Reference Name", "options": "reference_doctype", "reqd": 1 + }, + { + "fieldname": "ip_address", + "fieldtype": "Data", + "hidden": 1, + "label": "IP Address", + "read_only": 1 } ], "index_web_pages_for_search": 1, "links": [], - "modified": "2021-06-14 15:11:26.005805", + "modified": "2021-06-23 12:45:42.045696", "modified_by": "Administrator", "module": "Core", "name": "Feedback", diff --git a/frappe/core/doctype/feedback/test_feedback.py b/frappe/core/doctype/feedback/test_feedback.py index 702f9d8ac1..2a96d86874 100644 --- a/frappe/core/doctype/feedback/test_feedback.py +++ b/frappe/core/doctype/feedback/test_feedback.py @@ -12,12 +12,12 @@ class TestFeedback(unittest.TestCase): frappe.db.sql("delete from `tabFeedback` where reference_doctype = 'Blog Post'") from frappe.templates.includes.feedback.feedback import add_feedback, update_feedback - feedback = add_feedback('Blog Post', test_blog.name, 5, 'New feedback','test@test.com') + feedback = add_feedback('Blog Post', test_blog.name, 5, 'New feedback') self.assertEqual(feedback.feedback, 'New feedback') self.assertEqual(feedback.rating, 5) - updated_feedback = update_feedback('Blog Post', test_blog.name, 6, 'Updated feedback', 'test@test.com') + updated_feedback = update_feedback('Blog Post', test_blog.name, 6, 'Updated feedback') self.assertEqual(updated_feedback.feedback, 'Updated feedback') self.assertEqual(updated_feedback.rating, 6) diff --git a/frappe/templates/includes/feedback/feedback.html b/frappe/templates/includes/feedback/feedback.html index 55d44e95fb..f180fa5e42 100644 --- a/frappe/templates/includes/feedback/feedback.html +++ b/frappe/templates/includes/feedback/feedback.html @@ -7,9 +7,6 @@
-
- -
{% for rating in [1, 2, 3, 4, 5 ,6, 7, 8, 9, 10] %} @@ -41,7 +38,6 @@ feedback && $("#submit-feedback").html(__("Update")); if (frappe.is_user_logged_in()) { - $(".feedback_email").parent().toggleClass("hidden"); if (feedback) { $("[name='feedback']").val(feedback); toggle_feedback(); @@ -83,12 +79,12 @@ $('#submit-feedback').click((ev) => { let update = ev.target.innerText !== __("Submit"); + let rating = $('.rating').find('.rating-click').length; let args = { reference_doctype: "{{ reference_doctype or doctype }}", reference_name: "{{ reference_name or name }}", rating: rating, - feedback: $("[name='feedback']").val(), - feedback_email: $("[name='feedback_email']").val() || frappe.user_id + feedback: $("[name='feedback']").val() } if (args.rating == 0) { @@ -101,16 +97,14 @@ return false; } - if (args.feedback_email!=='Administrator' && !validate_email(args.feedback_email)) { - frappe.msgprint("{{ _("Please enter a valid email address.") }}"); - return false; - } - if (!update) { frappe.call({ method: "frappe.templates.includes.feedback.feedback.add_feedback", args: args, callback: function(r) { + if (!r.message) { + return + } toggle_feedback(); if (!frappe.is_user_logged_in()) { $("[name='feedback']").val(''); diff --git a/frappe/templates/includes/feedback/feedback.py b/frappe/templates/includes/feedback/feedback.py index 1830a3e09e..b15d9567d7 100644 --- a/frappe/templates/includes/feedback/feedback.py +++ b/frappe/templates/includes/feedback/feedback.py @@ -3,21 +3,33 @@ from __future__ import unicode_literals import frappe +from frappe.utils import add_to_date, now from frappe import _ @frappe.whitelist(allow_guest=True) -def add_feedback(reference_doctype, reference_name, rating, feedback, feedback_email): +def add_feedback(reference_doctype, reference_name, rating, feedback): doc = frappe.get_doc(reference_doctype, reference_name) if doc.disable_feedback == 1: return + feedback_count = frappe.db.count("Feedback", { + "reference_doctype": reference_doctype, + "reference_name": reference_name, + "ip_address": frappe.local.request_ip, + "creation": (">", add_to_date(now(), hours=-1)) + }) + + if feedback_count > 20: + frappe.msgprint(_('Hourly feedback limit reached')) + return + doc = frappe.new_doc('Feedback') doc.reference_doctype = reference_doctype doc.reference_name = reference_name doc.rating = rating doc.feedback = feedback - doc.email = feedback_email + doc.ip_address = frappe.local.request_ip doc.save(ignore_permissions=True) subject = _('New Feedback on {0}: {1}').format(reference_doctype, reference_name) @@ -25,13 +37,13 @@ def add_feedback(reference_doctype, reference_name, rating, feedback, feedback_e return doc @frappe.whitelist() -def update_feedback(reference_doctype, reference_name, rating, feedback, feedback_email): +def update_feedback(reference_doctype, reference_name, rating, feedback): doc = frappe.get_doc(reference_doctype, reference_name) if doc.disable_feedback == 1: return filters = { - "email": feedback_email, + "owner": frappe.session.user, "reference_doctype": reference_doctype, "reference_name": reference_name } @@ -49,7 +61,7 @@ def send_mail(feedback, subject): doc = frappe.get_doc(feedback.reference_doctype, feedback.reference_name) message = ("

{0} ({1})

".format(feedback.feedback, feedback.rating) - + "

{2}

".format(frappe.utils.get_request_site_address(), + + "

{2}

".format(frappe.utils.get_request_site_address(), feedback.name, _("View Feedback"))) diff --git a/frappe/website/doctype/blog_post/blog_post.py b/frappe/website/doctype/blog_post/blog_post.py index 965fc8e3e0..cb887a2ffc 100644 --- a/frappe/website/doctype/blog_post/blog_post.py +++ b/frappe/website/doctype/blog_post/blog_post.py @@ -147,12 +147,15 @@ class BlogPost(WebsiteGenerator): context.comment_text = _('{0} comments').format(len(context.comment_list)) def load_feedback(self, context): + user = frappe.session.user + if user == 'Guest': + user = '' feedback = frappe.get_all('Feedback', - fields=['email', 'feedback', 'rating'], + fields=['feedback', 'rating'], filters=dict( reference_doctype=self.doctype, reference_name=self.name, - email=frappe.session.user + owner=user ) ) context.user_feedback = feedback[0] if feedback else ''