@@ -27,7 +27,7 @@ def is_valid_feedback_request(key=None): | |||
if not key: | |||
return False | |||
is_feedback_submitted = frappe.db.get_value("Feedback Request", {"key": key}, "is_feedback_submitted") | |||
is_feedback_submitted = frappe.db.get_value("Feedback Request", { "key": key }, "is_feedback_submitted") | |||
if is_feedback_submitted: | |||
return False | |||
else: | |||
@@ -22,6 +22,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Enabled", | |||
@@ -49,6 +51,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"length": 0, | |||
@@ -75,6 +79,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Document Type", | |||
@@ -104,6 +110,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Email Field", | |||
@@ -131,6 +139,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Email Fieldname", | |||
@@ -158,6 +168,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"length": 0, | |||
@@ -185,6 +197,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Subject", | |||
@@ -212,6 +226,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"length": 0, | |||
@@ -228,6 +244,37 @@ | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
"collapsible": 0, | |||
"columns": 0, | |||
"default": "1", | |||
"description": "Send Feedback Request only if there is at least one communication is available for the document.", | |||
"fieldname": "check_communication", | |||
"fieldtype": "Check", | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Check Communication", | |||
"length": 0, | |||
"no_copy": 0, | |||
"permlevel": 0, | |||
"precision": "", | |||
"print_hide": 0, | |||
"print_hide_if_no_value": 0, | |||
"read_only": 0, | |||
"remember_last_selected_value": 0, | |||
"report_hide": 0, | |||
"reqd": 0, | |||
"search_index": 0, | |||
"set_only_once": 0, | |||
"unique": 0 | |||
}, | |||
{ | |||
"allow_on_submit": 0, | |||
"bold": 0, | |||
@@ -239,6 +286,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Condition", | |||
@@ -266,6 +315,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"length": 0, | |||
@@ -292,6 +343,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"length": 0, | |||
@@ -319,6 +372,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Message", | |||
@@ -346,6 +401,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Message", | |||
@@ -373,6 +430,8 @@ | |||
"hidden": 0, | |||
"ignore_user_permissions": 0, | |||
"ignore_xss_filter": 0, | |||
"in_filter": 0, | |||
"in_global_search": 0, | |||
"in_list_view": 0, | |||
"in_standard_filter": 0, | |||
"label": "Example", | |||
@@ -402,7 +461,7 @@ | |||
"issingle": 0, | |||
"istable": 0, | |||
"max_attachments": 0, | |||
"modified": "2017-02-10 11:25:41.643832", | |||
"modified": "2017-02-17 05:19:08.819230", | |||
"modified_by": "Administrator", | |||
"module": "Core", | |||
"name": "Feedback Trigger", | |||
@@ -433,6 +492,7 @@ | |||
"quick_entry": 0, | |||
"read_only": 0, | |||
"read_only_onload": 0, | |||
"show_name_in_global_search": 0, | |||
"sort_field": "modified", | |||
"sort_order": "DESC", | |||
"title_field": "document_type", | |||
@@ -36,7 +36,7 @@ def send_feedback_request(reference_doctype, reference_name, trigger=None, detai | |||
feedback_request, url = get_feedback_request_url(reference_doctype, | |||
reference_name, details.get("recipients"), trigger) | |||
feedback_url = "Please click <a href='{url}'>here</a> to submit your feedback.".format(url=url) | |||
feedback_url = frappe.render_template("templates/emails/feedback_request_url.html", { "url": url }) | |||
# appending feedback url to message body | |||
details.update({ "message": "{message}<br>{feedback_url}".format( | |||
@@ -80,13 +80,17 @@ def get_feedback_request_details(reference_doctype, reference_name, trigger=None | |||
context = get_context(doc) | |||
recipients = doc.get(feedback_trigger.email_fieldname, None) | |||
communications = frappe.get_all("Communication", filters={ | |||
"reference_doctype": reference_doctype, | |||
"reference_name": reference_name, | |||
"communication_type": "Communication" | |||
}, fields=["name"]) | |||
if feedback_trigger.check_communication: | |||
communications = frappe.get_all("Communication", filters={ | |||
"reference_doctype": reference_doctype, | |||
"reference_name": reference_name, | |||
"communication_type": "Communication" | |||
}, fields=["name"]) | |||
if len(communications) < 1: | |||
frappe.throw(_("No communication found for the document")) | |||
if recipients and eval(feedback_trigger.condition, context) and len(communications) >= 1: | |||
if recipients and eval(feedback_trigger.condition, context): | |||
subject = feedback_trigger.subject | |||
context.update({ "feedback_trigger": feedback_trigger }) | |||
@@ -118,7 +122,7 @@ def get_feedback_request_url(reference_doctype, reference_name, recipients, trig | |||
doctype=reference_doctype, | |||
docname=reference_name, | |||
email_id=recipients, | |||
nonce=feedback_request.name | |||
nonce=feedback_request.key | |||
) | |||
return [ feedback_request.name, feedback_url ] | |||
@@ -16,7 +16,7 @@ | |||
<li class="divider"></li> | |||
<li style="position: relative;"> | |||
<a class="strong badge-hover"> | |||
<span>{%= __("Feedback Rating") %}</span> | |||
<span>{%= __("Feedback") %}</span> | |||
</a> | |||
</li> | |||
<li class="rating-icons"></li> | |||
@@ -0,0 +1,25 @@ | |||
<html> | |||
<body> | |||
<div align="center"> | |||
Please take a few minute to leave a feedback - we would really appreciate it!<br> | |||
Rating (select a star) | |||
<div class="user-ratings"> | |||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=1"> | |||
<img src="/assets/frappe/images/star.png"> | |||
</a> | |||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=2"> | |||
<img src="/assets/frappe/images/star.png"> | |||
</a> | |||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=3"> | |||
<img src="/assets/frappe/images/star.png"> | |||
</a> | |||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=4"> | |||
<img src="/assets/frappe/images/star.png"> | |||
</a> | |||
<a class="rating" style="text-decoration: none; color: black" href="{{url}}&rating=5"> | |||
<img src="/assets/frappe/images/star.png"> | |||
</a> | |||
</div> | |||
</div> | |||
</body> | |||
</html> |
@@ -49,22 +49,31 @@ | |||
this.key = get_url_arg("key"); | |||
this.reference_name = get_url_arg("reference_name"); | |||
this.reference_doctype = get_url_arg("reference_doctype"); | |||
this.sender = get_url_arg("email") | |||
this.sender = get_url_arg("email"); | |||
this.rating = get_url_arg("rating") || 0; | |||
me.bind_events(); | |||
// set ratings | |||
console.log(this.rating) | |||
this.set_ratings_icon(this.rating) | |||
this.bind_events(); | |||
$("#feedback-msg").empty().html(__("Please share your feedback for {0}", [me.reference_name])); | |||
}, | |||
set_ratings_icon: function(idx) { | |||
$('.star-icon.fa-star').removeClass('fa-star').addClass('fa-star-o'); | |||
for(var i=0; i<parseInt(idx); i++) { | |||
$($('.star-icon').get(i)).removeClass('fa-star-o').addClass('fa-star'); | |||
} | |||
}, | |||
bind_events: function() { | |||
// bind ratings on hover | |||
var me = this; | |||
$('.star-icon').hover(function() { | |||
var idx = $(this).attr('data-idx'); | |||
$('.star-icon.fa-star').removeClass('fa-star').addClass('fa-star-o'); | |||
for(var i=0; i<parseInt(idx); i++) { | |||
$($('.star-icon').get(i)).removeClass('fa-star-o').addClass('fa-star'); | |||
} | |||
me.set_ratings_icon(idx); | |||
}); | |||
// bind submit button | |||
@@ -72,6 +81,9 @@ | |||
if(!$('.star-icon.fa-star').length) { | |||
frappe.msgprint(__("Please give a rating.")); | |||
return; | |||
} else if(!$('.feedback-text').val().length){ | |||
frappe.msgprint(__("Please give a detailed feebdack.")); | |||
return; | |||
} | |||
frappe.call({ | |||
@@ -25,29 +25,34 @@ def accept(key, sender, reference_doctype, reference_name, feedback, rating): | |||
if not reference_doctype and not reference_name: | |||
frappe.throw("Invalid Reference Doctype, Reference Name") | |||
if not rating or not feedback: | |||
frappe.throw("Please give both Rating and Detailed Feedback") | |||
if not is_valid_feedback_request(key): | |||
frappe.throw("Link is expired") | |||
feedback_request = frappe.db.get_value("Feedback Request", {"key": key}) | |||
communication = frappe.get_doc({ | |||
"rating": rating, | |||
"sender": sender, | |||
"status": "Closed", | |||
"feedback": feedback, | |||
"doctype": "Communication", | |||
"sent_or_received": "Received", | |||
"communication_type": "Feedback", | |||
"reference_name": reference_name, | |||
"feedback_request": feedback_request, | |||
"reference_doctype": reference_doctype, | |||
"subject": "Feedback for {0} {1}".format(reference_doctype, reference_name), | |||
}).insert(ignore_permissions=True) | |||
doc = frappe.get_doc("Feedback Request", feedback_request) | |||
doc.is_feedback_submitted = 1 | |||
doc.rating = rating | |||
doc.reference_communication = communication.name | |||
doc.save(ignore_permissions=True) | |||
return True | |||
try: | |||
feedback_request = frappe.db.get_value("Feedback Request", {"key": key}) | |||
communication = frappe.get_doc({ | |||
"rating": rating, | |||
"sender": sender, | |||
"status": "Closed", | |||
"feedback": feedback, | |||
"doctype": "Communication", | |||
"sent_or_received": "Received", | |||
"communication_type": "Feedback", | |||
"reference_name": reference_name, | |||
"feedback_request": feedback_request, | |||
"reference_doctype": reference_doctype, | |||
"subject": "Feedback for {0} {1}".format(reference_doctype, reference_name), | |||
}).insert(ignore_permissions=True) | |||
doc = frappe.get_doc("Feedback Request", feedback_request) | |||
doc.is_feedback_submitted = 1 | |||
doc.rating = rating | |||
doc.reference_communication = communication.name | |||
doc.save(ignore_permissions=True) | |||
return True | |||
except Exception as e: | |||
frappe.throw("Can not submit feedback, Please try again later") |